ModelState.IsValid return false 后如何显示值

How can display value after ModelState.IsValid return false

我致力于简单的 MVC 应用程序。在我的 EditProduct 视图中,我想在禁用输入中显示产品的当前类别。我有一个下拉列表,用户可以在其中选择带有选项标签 "Select Category" 的类别。

查看EditProduct:

<div class="form-group">
            <label for="disabledInput" class="control-label col-md-2"><b>Current Category</b></label> 
            <div class="col-md-10">
                <input class="form-control" id="disabledInput" type="text" placeholder="@Model.Category" disabled>
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.CategoryID, "Category", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("CategoryID", (SelectList)ViewBag.CategoryID, "Select Category", htmlAttributes: new { @class = "form-control " })
                @Html.ValidationMessageFor(model => model.CategoryID, "", new { @class = "text-success" })
            </div>
        </div>

我输入了输入值 @Model.Category 的占位符。这是当前产品的名称。

用户需要选择类别:

public class ProductsViewModel
{
    \ .....

    public string Category { get; set; }

    [Required(ErrorMessage = "The Category is required.")]
    public int CategoryID { get; set; }
}

当我 select 编辑产品时,一切正常 - 当前类别显示在输入中。如果我是select分类,点保存也行。

但是,如果我不选择类别并单击保存,ModelState.IsValid return false 然后 @Model.Category 从输入中消失。

如何使用这种方法在 ModelState.IsValid return false 后显示产品当前类别?或者其他方法?

您手动创建的输入没有 name 属性或 value 属性并且是 disabled。所有 3 都意味着与该输入相关的任何内容都不会 post 返回,因此当您 return 视图时,Categorynull。下一个问题是您的下拉列表也绑定到名为 CategoryID 的 属性 并且您的 SelectList 也具有相同的名称,这会导致问题。然后你有一个 class 表明它是一个视图模型但继续使用 ViewBag (为什么?)。

将视图模型更改为

public class ProductsViewModel
{
    .....

    public string Category { get; set; } // see notes below

    [Display(Name = "Category")]
    [Required(ErrorMessage = "The Category is required.")]
    public int CategoryID { get; set; }
    public SelectList CategoryList { get; set; }
}

然后在视图中

@Html.LabelFor(model => model.CategoryID, new { @class = "control-label col-md-2" })
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "Select Category", new { @class = "form-control " })
@Html.ValidationMessageFor(model => model.CategoryID, new { @class = "text-success" })

并在控制器中

public ActionResult Edit(int ID)
{
  ProductsViewModel model = new ProductsViewModel();
  model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // adjust parameters to suit
  model.CategoryID = ?; // set this if you want an initial option displayed
  return View(model);
}

现在当页面初始呈现时,选择的选项将根据CategoryID的值显示。不清楚为什么您也想在文本框中显示相同的值,但如果是这样,请将类别名称分配给 属性 string Category 并使用

@Html.TextBoxFor(m => m.Category, new { readonly = "readonly" })

这将创建一个包含 Category 初始值的 'read-only' 文本框,并将 post 返回。