模型在按钮单击 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 应用程序中添加事件以提交按钮单击
C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值