为什么我的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
            );
        }

为什么我的ASP.NET MVC模型在控制器中填充,但在视图中为Null

目前还不完全清楚您想在这里做什么,也不完全清楚为什么要这样做。如果你想显示一个表单来编辑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的初始值是nullstring.Empty,所以当返回视图时,它仍然是nullstring.Empty。要查看这项工作,请将POST方法修改为

[HttpPost]
public ActionResult Index(OrderNoLocationViewModel model)
{
  ModelState.Clear();
  model.Shipper = "Some other value";
  return View(model);
}

文本框现在将包含"其他值"。然而,这并不是您真正想要做的事情,因为清除ModelState也会删除所有验证错误以及