一个简单的问题......当用户没有输入值(可选值)并提交表单时,如何处理异常?我正在寻找一些简单的方法来实现..
我遇到异常,例如“对象引用未设置为对象的实例。”
以下是我的控制器
public ActionResult GenerateReport(FormCollection Form)
{
int type_id = Convert.ToInt32(Form["type_id"].ToString());
int ClientId = Convert.ToInt32(Form["SelectedClientId"].ToString());
DateTime Start_Date = Convert.ToDateTime(Form["Start_Date"].ToString());
DateTime End_Date = Convert.ToDateTime(Form["End_Date"].ToString());
//StringBuilder sb = new StringBuilder();
// var cm = new ContractManager();
var cm = db.contracts.Where( c=>c.tb_contract_type_id == type_id ).ToList();
return View(cm);
}
以下是视图
@using (Ajax.BeginForm("GenerateReport", "Home", new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "Generate-Report" }, new { id = "Form" }))
{
<div class="editor">
<div class="editor-label">
Client Name
</div>
<div id="Clients" class="editor-field">
@Html.Partial("~/Views/Contracts/SelectClient.cshtml", Model)
</div>
</div>
<div class="editor">
<div class="editor-label">
@Html.LabelFor(model => model.cmContracts.tb_contract_type_id)
</div>
<div class="editor-field">
@Html.DropDownList("type_id", ViewBag.contracttypes as SelectList, new { style = "width: 150px;" })
</div>
</div>
<div class="editor">
<div class="editor-label">
Start Date
</div>
<div class="editor-field">
@Html.TextBox("Start_Date", "", new { data_datepicker = true })
</div>
</div>
<div class="editor">
<div class="editor-label">
End Date
</div>
<div class="editor-field">
@Html.TextBox("End_Date", "", new { data_datepicker = true })
</div>
</div>
<p>
<input style="margin:20px auto 0px 120px; " type="submit" value="Generate" />
</p>
}
答案 0 :(得分:2)
您可以使用验证。在ASP.NET MVC中,可以通过使用Data Annotation属性修饰视图模型属性来实现。我们来举个例子:
public class MyViewModel
{
[Required(ErrorMessage = "This value is absolutely required")]
public string SomeValue { get; set; }
}
必需属性不言自明。然后我们可以有一个控制器:
public class HomeController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel();
return View(model);
}
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
// there was a validation error => redisplay the view
return View(model);
}
// success
return Content("Thanks for submitting the form");
}
}
最后你可以得到一个相应的观点:
@model MyViewModel
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(x => x.SomeValue)
@Html.EditorForFor(x => x.SomeValue)
@Html.ValidationMessageFor(x => x.SomeValue)
</div>
<button type="submit">OK</button>
}
在此视图中,如果服务器上的验证失败,ValidationMessageFor
帮助程序将显示相关的错误消息。
如果您想要使用相互依赖的属性来处理更复杂的验证规则,我建议您查看FluentValidation.NET
,它提供了一种非常直观且功能强大的方法来编写复杂的验证规则,它有一个{{ 3}}并提供了一种孤立的great integration with ASP.NET MVC
简单方法。
答案 1 :(得分:1)
最简单的方法不是抛出异常,而是使用validation controls验证用户输入。
通过这种方式,您可以在正确使用逻辑之前处理用户输入的任何错误。
编辑,因为您的问题是可选字段抛出空引用异常,您应该在使用它之前检查其值是否为null。你可以这样做:
string value = foo.Value;
if (value == null) value = string.empty;
当然,您应该在相关属性上执行此操作,并使用正确的类型,如果它不是string
。然后,您可以使用value
变量,而不是直接使用控件的属性。