当用户没有输入值并提交表单时如何处理异常?

时间:2013-05-28 13:24:00

标签: c# asp.net-mvc-3 razor

一个简单的问题......当用户没有输入值(可选值)并提交表单时,如何处理异常?我正在寻找一些简单的方法来实现..

我遇到异常,例如“对象引用未设置为对象的实例。”

以下是我的控制器

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>
}

2 个答案:

答案 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变量,而不是直接使用控件的属性。