模型在按钮单击 ASP.NET MVC 5 时为空

Posted

技术标签:

【中文标题】模型在按钮单击 ASP.NET MVC 5 时为空【英文标题】:Model is null on button click ASP.NET MVC 5 【发布时间】:2015-08-24 18:58:58 【问题描述】:

我使用 ajax 将部分视图加载到视图中。局部视图中有一个下拉列表,但是每当我选择一个下拉选项并单击局部视图中的按钮进行连接时,我都会收到模型为空的错误。这很奇怪,因为模型已经填充了下拉菜单,并且它不会在我的控制器上的断点上执行任何操作。我为此花了几天时间。

错误是:

“System.NullReferenceException”类型的异常发生在 App_Web_m2cylvfu.dll 但未在用户代码中处理 附加 信息:对象引用未设置为对象的实例。

HTML

<div>
    <fieldset>
        <div>
            @html.LabelFor(m => m.ServerName)
        </div>
        <div>
            @Html.DropDownListFor(model => model.ServerName, Model.ServerNames, "-- Select Server --")
        </div>
        <div>
            <input id="btnConnect" type="submit" name="Connect" value="Connect" />
        </div>
    </fieldset>
</div>

JAVASCRIPT

$(document).ready(function() 

  $('#btnConnect').click(function(evt) 
    evt.preventDefault();
    evt.stopPropagation();

    var selectedServerName = $('#ServerName').val()
    $.ajax(
      url: '@Url.Action("ConnectToServer", "Settings")',
      data: 
        'servername': selectedServerName
      ,
      cache: false,
      type: 'post',
      datatype: 'json',
      success: function(result) 
        var $el = $("#DatabaseName");
        $el.empty(); // remove old options
        $el.append($("<option></option>").attr("value", '').text('Please Select'));
        $.each(result, function(value, key) 
          $el.append($("<option></option>").attr("value", value).text(key));
        );
      
    );

  );


控制器

public PartialViewResult Index() 
    var afConnectionModel = new AFConnectionModel() 
        ServerNames = GetServers()
    ;
    return PartialView(afConnectionModel);


[HttpPost]
public JsonResult ConnectToServer(string servername) 
    return Json(new 
        foo = "bar", baz = "Blech"
    );


private static dynamic GetServers() 
    var piSystems = new PISystems().Select(c => new Afart 
        Id = c.Name, ServerName = c.Name
    );
    return new SelectList(piSystems, "Id", "ServerName");
 

public class Afart
    
        public string Id  get; set; 

        public string ServerName  get; set; 
      

【问题讨论】:

您是否尝试过单步执行代码以查明位置和原因 它在剃刀代码中抛出异常:Model.ServerNames。如果我知道为什么,我就不会问这个问题了。 :-) 您是否使用 LINQ 查询将 PISystems() 投影到... Afart? 那么 ServerNames 是什么样子的...... 我已经为 ServerNames 添加了类。是的,我正在使用 LINQ 投影到 Afart。我应该提到下拉列表已正确填充,我可以从下拉列表中进行选择。只有当我单击“连接”时才会收到错误消息。 【参考方案1】:

我发现了问题。 javascript 没有在局部视图中被调用,它直接进入控制器操作并返回而不重新加载 viewbag 数据。

【讨论】:

【参考方案2】:

它没有击中控制器,因为你有一些错误 Javascript 代码...请尝试此代码

$(document).ready(function() 
  $('#btnConnect').click(function(evt) 
    evt.preventDefault();
    evt.stopPropagation();

    var selectedServerName = $('#ServerName').val();
    $.ajax(
      url: '@Url.Action("ConnectToServer", "Settings")',
      data: 
        servername: selectedServerName
      ,
      cache: false,
      type: 'post',
      datatype: 'json',
      success: function(result) 
        var el = $("#DatabaseName");
        el.empty(); // remove old options
        el.append($("<option></option>").attr("value", '').text('Please Select'));
        $.each(result, function(value, key) 
          $el.append($("<option></option>").attr("value", value).text(key));
        );
      
    );

  );

【讨论】:

以上是关于模型在按钮单击 ASP.NET MVC 5 时为空的主要内容,如果未能解决你的问题,请参考以下文章

在按钮单击文本框值是空的使用 asp.net mvc 显示警报?

jQuery Validate:在 ASP.NET MVC 5 应用程序中添加事件以提交按钮单击

在 ASP.NET MVC 中单击按钮时呈现部分视图

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

在 ASP.net MVC 5 应用程序中单击按钮时使用 JavaScript/jQuery 将用户重定向到页面

ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮