【问题标题】:How can display value after ModelState.IsValid return falseModelState.IsValid 返回 false 后如何显示值
【发布时间】:2015-03-19 02:11:20
【问题描述】:

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

查看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; }
}

当我选择要编辑的产品时,一切正常 - 当前类别显示在输入中。如果我选择类别并单击保存也可以。

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

如何在 ModelState.IsValid 使用这种方法返回 false 后显示产品当前类别?或者其他方式来做到这一点?

【问题讨论】:

  • 您的代码存在一些潜在问题。首先,禁用的输入不会回发任何内容,因此当您返回视图时它将始终为空(改为只读)。并且您永远不应将 SelectList 命名为与您绑定到的属性相同的名称(将其更改为 ViewBag.CategoryList
  • 此外,您禁用的输入没有namevalue 属性,因此即使您将其设为只读,它也不会回发任何内容。创建一个新属性,比如 CurrentCategory 并绑定到它。
  • @StephenMuecke 我将我的视图包的名称更改为ViewBag.CategoryList,这会将我当前的产品类别绑定到下拉列表。我只想要那个。我删除输入,现在一切正常。感谢您的帮助!
  • 我会发布一个答案来解释您遇到的其他一些问题。

标签: c# html asp.net-mvc entity-framework-5


【解决方案1】:

您手动创建的输入没有name 属性或value 属性并且是disabled。所有 3 都意味着与该输入相关的任何内容都不会回发,因此当您返回视图时,Categorynull。下一个问题是您的下拉列表也绑定到名为 CategoryID 的属性,而您的 SelectList 也具有相同的名称,这会导致问题。然后你有一个类表明它是一个视图模型但继续使用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 初始值的“只读”文本框并将回发。

【讨论】:

  • 你的解释对我很有帮助。我更正了我的代码,现在很清晰并且工作完美。这是我的第一个项目,我知道要学习很多东西,但是您对视图模型的概念帮助很大。对不起我的英语,谢谢!
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2011-02-22
  • 2019-09-11
  • 1970-01-01
  • 2018-02-16
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多