我有一个简单的ViewModel:
public class CategoryViewModel
{
[Display(Name = "Category ID")]
[Editable(false)]
public int CategoryId { get; set; }
[Required(ErrorMessage = "Name is required")]
[StringLength(100, MinimumLength = 2, ErrorMessage = "You must enter a category name of at least 2 and maximum 100 characters")]
[Display(Name = "Name")]
public string Name { get; set; }
[HiddenInput(DisplayValue = false)]
public int? ParentId { get; set; }
}
我有一个控制器发送到视图和新的,未填充的viewmodel,其CategoryId和ParentId设置为0.我的视图使用@ Html.EditorFor使用viewmodel(自定义object.cshtml编辑器模板),但是保持简单,我简单地改变了它:
var options = new AjaxOptions()
{
Url = "/Api/Category/Post/"
OnComplete = "onCategorySaveComplete(xhr, status)",
OnBegin = "onCategorySaveBegin",
OnFailure = "onCategorySaveFailure(xhr, status)",
};
@using (Ajax.BeginForm(options))
{
<div class="inputForm">
<div class="header">@(Model.CategoryId == 0 ? "New Category" : "Edit "+Model.Name+" ("+Model.CategoryId+"/"+Model.ParentId+")")</div>
<div class="section">
<input type="hidden" name="CategoryId" value="" data-bind="value: CategoryId" />
<input type="hidden" name="ParentId" value="" data-bind="value: ParentId" />
<div class="line">
<div class="label">
@Html.LabelFor(m => m.Name) *
</div>
<div class="input">
@Html.TextBoxFor(m => m.Name,null,new {@data_bind = "value: Name"})
@Html.ValidationMessageFor(m => m.Name)
</div>
</div>
</div>
@Html.ValidationSummary("Some data is not correct:")
<div class="footer"> <input type="submit" id="btnSave" value="Save" /></div>
</div>
}
在我的API控制器中,我有:
public CategoryViewModel Post(CategoryViewModel value)
{
value = CategoryService.AddOrUpdate(value);
return value;
}
我有其他客户端功能,允许用户从KendoUI树视图中选择一个类别,它通过API调用加载ViewModel,并使用KnockOut进行绑定,但这一切都很好用,所以让我暂时跳过它
现在,当我提交表单并查看发送到服务器的内容时,我会看到以下内容:
Key Value
Request POST /Api/Category/Post/ HTTP/1.1
Accept */*
Content-Type application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With XMLHttpRequest
Referer http://localhost:3709/Category/
Accept-Language en-GB,nl-BE;q=0.5
Accept-Encoding gzip, deflate
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host localhost:3709
Content-Length 71
Connection Keep-Alive
Cache-Control no-cache
Cookie GUEST_LANGUAGE_ID=en_US; COOKIE_SUPPORT=true
和请求正文:
CategoryId=1130&ParentId=4&Name=Sensors&X-Requested-With=XMLHttpRequest
到目前为止,我猜是正常的。但是我在我的API控制器中添加了一个断点,在这里我看到我的CategoryViewModel值实际上只包含“Name”和“ParentId”,并且“CategoryId”为0 我的服务然后认为它需要创建一个新的Category,它返回一个新的CategoryViewModel然后返回给客户端是JSON字符串。
我无法理解为什么我的CategoryId没有读入我的ViewModel。此外,我试图通过JSON字符串提交数据而不是以URLEcoded方式提交数据。 我应该简单地离开助手并直接使用jquery吗?
非常感谢你的帮助
编辑夜间睡眠后:我的CategoryId没有被读入我的ViewModel的原因很简单:CategoryId的注释为[Editable(false)] 如果我删除它,工作。我实际上只将这些注释用于EditorFor和验证消息,而没有意识到它会阻止实际写入字段。
所以我需要另一种方法告诉EditorFor将某些字段呈现为隐藏的html字段。有任何想法吗? 为什么使用@ Ajax.BeginForm无法配置为将JSON字符串发送到服务器而不是url编码,这仍然是。 感谢
答案 0 :(得分:0)
所以我需要另一种方法告诉EditorFor将某些字段呈现为隐藏的html字段。有什么想法吗?
您可以使用HiddenInput
属性来指示编辑器模板将其呈现为隐藏字段:
[HiddenInput(DisplayValue = false)]
public int CategoryId { get; set; }