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 视图时,Category
是 null
。下一个问题是您的下拉列表也绑定到名为 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 返回。
我致力于简单的 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 视图时,Category
是 null
。下一个问题是您的下拉列表也绑定到名为 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 返回。