-1

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

我收到“对象引用未设置为对象实例”之类的异常。

下面是我的控制器

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

2 回答 2

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它提供了一种非常直观且强大的方式来编写复杂的验证规则,它有一个great integration with ASP.NET MVC并且提供了一种简单unit test your validation logic的隔离方法。

于 2013-05-28T13:26:51.247 回答
1

最简单的方法不是抛出异常,而是使用验证控件验证用户输入。

这样,您可以在正确处理逻辑之前处理用户输入的任何错误。

编辑:由于您的问题是一个可选字段抛出空引用异常,您应该在使用它之前检查它的值是否为空。你可以这样做:

string value = foo.Value;
if (value == null) value = string.empty;

当然,您应该在相关属性上执行此操作,如果它不是string. 然后,您可以使用该value变量而不是直接使用控件的属性。

于 2013-05-28T13:26:00.687 回答