为什么我的ASP.NET MVC模型在控制器中填充,但在视图中为Null
本文关键字:填充 视图 Null 控制器 ASP 我的 NET MVC 模型 为什么 | 更新日期: 2023-09-27 18:26:53
我遇到了一个非常愚蠢的问题。
我有一个ASP.NET MVC页面,它绝对拒绝显示我的视图模型。即使我删除了分配给视图模型的数据库结果,并只是在控制器内部的视图模型属性中硬编码我想要的值,它仍然不起作用。在调试过程中,我可以从控制器中看到正确的数据被放置在ViewModel中,但View的行为就像它从未得到过它。使用快速手表,我可以看到数据在字段中。
它将显示在LabelFors中使用的变量的名称,但永远不会在文本框中显示变量的值。
查看
@model Project1.ViewModels.OrderNoLocationViewModel
@{ Html.EnableClientValidation(); }
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<table class="item-display" style="width: 100%;">
<tr>
<td class="label">
<div class="editor-label">@Html.LabelFor(model => model.Shipper):</div>
</td>
<td class="value">
<div class="editor-field">
@Html.TextBoxFor(model => model.Shipper)
@Html.ValidationMessageFor(model => model.Shipper)
</div>
</td>
</table>
}
控制器
[HttpPost]
[ValidateAntiForgeryToken()]
public ActionResult Index(OrderNoLocationViewModel model, string consigneeFilter, string orderNoFilter, string button)
{
model = new OrderNoLocationViewModel()
{
Shipper = "Ray"
};
return View(model);
}
我根本不知道发生了什么……我还有其他页面在工作,而这实际上是唯一一个这样的页面。
请帮忙!:(
编辑:
路由
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
目前还不完全清楚您想在这里做什么,也不完全清楚为什么要这样做。如果你想显示一个表单来编辑OrderNoLocationViewModel
的属性,那么最初用GET方法显示它
public ActionResult Index()
{
var model = model = new OrderNoLocationViewModel();
model.Shipper = "Ray";
return View(model);
}
文本框现在将显示"Ray"。
当你张贴回
[HttpPost]
public ActionResult Index(OrderNoLocationViewModel model)
{
}
model.Shipper
将包含文本框中的任何值(如果用户未更改值,则为"Ray")。
如您在POST方法中所做的那样重新分配模型
model = new OrderNoLocationViewModel()
{
Shipper = "Ray"
};
return View(model);
除非清除ModelState
(视图采用ModelState
中的值),否则不会产生任何影响。我假设在您的情况下,Shipper
的初始值是null
或string.Empty
,所以当返回视图时,它仍然是null
或string.Empty
。要查看这项工作,请将POST方法修改为
[HttpPost]
public ActionResult Index(OrderNoLocationViewModel model)
{
ModelState.Clear();
model.Shipper = "Some other value";
return View(model);
}
文本框现在将包含"其他值"。然而,这并不是您真正想要做的事情,因为清除ModelState
也会删除所有验证错误以及