我获得ProductModel
财产public ProductCategoryModel Category { get; set; }
。 ProductCategoryModel
显然是要动态添加或删除的类别集。因此,在创建/编辑ProductModel
时,我需要一个包含现有类别的1-value-onle下拉列表。我可以以某种方式为此目的使用@Html.EditorFor(...)
吗?
我现在进行的解决方案是
@Html.DropDownList(
"CategoryTitle",
SelectListGenerator.GenerateFrom(categoires, i => i.Title, i => i.Title),
new { htmlAttributes = new {
@class = "form-control",
@data_val = "true",
@data_val_required = "Не выбрана категория!",
@id = "CategoryTitle",
@name = "CategoryTitle"
} })
因为它不返回ProductCategoryModel
对象,而只返回字符串 - 它的名称,我被迫在我的控制器中做额外的工作:
public ActionResult Create(CreateProduct_ViewModel vm)
{
vm.ProductModel.Category = _productCategoryEntities.ByName(vm.CategoryTitle);
ValidateModel(vm);
if (ModelState.IsValid)
{
_productEntities.Products.Add(vm.ProductModel);
_productEntities.SaveChanges();
return RedirectToAction(nameof(Index));
}
return View(vm);
}
这段代码看起来有些混乱和缺乏。
所以,再次,在创建新ProductModel
时,我需要一个下拉列表,其中可以选择现有类别而不是表单来创建新类别(这是{{1的默认值] }})。我想在我的@Html.EditorFor(...)
方法中收到一个ProductModel
对象,因此它在指定的Create(...)
属性中看起来像Create(ProductModel model)
,从而避免了这个Category
。
答案 0 :(得分:0)
EditorFor
是一个模板化的助手。它根据属性类型DataType
注释等选择要使用的模板。因为CategoryTitle
只是一个字符串,所以您将得到一个标准文本框。
DropDownListFor
在这里更合适,因为您需要明确地控制该控件。如果发布的值始终为null,则表示您未正确绑定它。它应该绑定到视图模型上的属性,并且您发布的值应该是相同的类型(或强制该类型)。例如,select元素的发布值将始终为字符串,但如果它类似于" 1",则模型绑定器足够智能以将其绑定到int属性。但是,如果发布的值类似于" true"并且您试图将其绑定到int,它不会绑定,因为" true"不能强制转换为int。这是一个人为的例子,但它只是为了说明这一点。
必须按发布的值查找类别是不可避免的。同样,发布的值将是一个字符串。无法从select元素发布整个类别对象。因此,您可以做的最好的事情是使用已发布的值来查找类别对象,然后将其与类别属性相关联。