MVC 5 中 Ajax.BeginForm 的模型绑定失败
Model binding is Failing for Ajax.BeginForm in MVC 5
我的视图是为列表生成的脚手架。列表的模型是:
public class LogsViewModel
{
public string Category { get; set; }
public string ClientIP { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
public string Message { get; set; }
}
为了过滤整个列表,我提供了一个 bootstrap-modal 表单,它有多个输入元素,例如:category、clientip、date 和 message。此模态的形式按以下方式使用 Ajax.BeginForm:
@using (Ajax.BeginForm(
new AjaxOptions
{
HttpMethod = "get",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "results"
}))
{
<fieldset>
<div class="form-group">
<label for="recipient-name" class="control-label">Category:</label>
<select class="form-control" id="Category">
<option>Information</option>
<option>General Error</option>
</select>
@*<input type="text" class="form-control" id="category">*@
</div>
<div class="form-group">
<label for="recipient-name" class="control-label">IP:</label>
<input type="text" class="form-control" id="ClientIP">
</div>
<div class="form-group" id="startDTPicker" style="position:relative">
<label for="recipient-name" class="control-label" id="startDate">Start Date:</label>
<input type="text" class="form-control" id="StartDate">
</div>
<div class="form-group" id="endDTPicker" style="position:relative">
<label for="recipient-name" class="control-label" id="endDate">End Date:</label>
<input type="text" class="form-control" id="EndDate">
</div>
<div class="form-group" id="startDTPicker">
<label for="recipient-name" class="control-label">Message:</label>
<input type="text" class="form-control" id="Message">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<input type="submit" class="btn btn-primary" value="Show Results" />
</div>
</fieldset>
}
然后在控制器中,我试图获取这些参数 (category=...)。我已将 ActionMethod 声明为:
public ActionResult Index(LogsViewModel viewModel)
{
//all the properties are null when the Ajax request invokes this method
}
导致问题的原因是什么,最好的处理方法是什么?
正如我在您的视图代码中看到的那样,您没有在所有 input
标签上设置 name
属性。但是你需要它们,它们应该匹配你的模型 属性 名称,因为当你 post 你的值到服务器时它们使用类似的键。
我的意思是你应该改变这个:
<input type="text" class="form-control" id="ClientIP">
对于所有标签:
<input type="text" name="ClientIP" class="form-control" id="ClientIP">
我的视图是为列表生成的脚手架。列表的模型是:
public class LogsViewModel
{
public string Category { get; set; }
public string ClientIP { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
public string Message { get; set; }
}
为了过滤整个列表,我提供了一个 bootstrap-modal 表单,它有多个输入元素,例如:category、clientip、date 和 message。此模态的形式按以下方式使用 Ajax.BeginForm:
@using (Ajax.BeginForm(
new AjaxOptions
{
HttpMethod = "get",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "results"
}))
{
<fieldset>
<div class="form-group">
<label for="recipient-name" class="control-label">Category:</label>
<select class="form-control" id="Category">
<option>Information</option>
<option>General Error</option>
</select>
@*<input type="text" class="form-control" id="category">*@
</div>
<div class="form-group">
<label for="recipient-name" class="control-label">IP:</label>
<input type="text" class="form-control" id="ClientIP">
</div>
<div class="form-group" id="startDTPicker" style="position:relative">
<label for="recipient-name" class="control-label" id="startDate">Start Date:</label>
<input type="text" class="form-control" id="StartDate">
</div>
<div class="form-group" id="endDTPicker" style="position:relative">
<label for="recipient-name" class="control-label" id="endDate">End Date:</label>
<input type="text" class="form-control" id="EndDate">
</div>
<div class="form-group" id="startDTPicker">
<label for="recipient-name" class="control-label">Message:</label>
<input type="text" class="form-control" id="Message">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<input type="submit" class="btn btn-primary" value="Show Results" />
</div>
</fieldset>
}
然后在控制器中,我试图获取这些参数 (category=...)。我已将 ActionMethod 声明为:
public ActionResult Index(LogsViewModel viewModel)
{
//all the properties are null when the Ajax request invokes this method
}
导致问题的原因是什么,最好的处理方法是什么?
正如我在您的视图代码中看到的那样,您没有在所有 input
标签上设置 name
属性。但是你需要它们,它们应该匹配你的模型 属性 名称,因为当你 post 你的值到服务器时它们使用类似的键。
我的意思是你应该改变这个:
<input type="text" class="form-control" id="ClientIP">
对于所有标签:
<input type="text" name="ClientIP" class="form-control" id="ClientIP">