-1

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 では、ビュー モデルのプロパティをデータ注釈属性で装飾することでこれを実現できます。例を見てみましょう:

public class MyViewModel
{
    [Required(ErrorMessage = "This value is absolutely required")]
    public string SomeValue { get; set; }
}

Required 属性は一目瞭然です。次に、コントローラーを作成できます。

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

最も簡単な方法は、例外をスローするのではなく、検証コントロールを使用してユーザー入力を検証することです。

このようにして、適切なロジックに到達する前に、ユーザー入力の問題を処理できます。

編集:オプションのフィールドがnull参照例外をスローしているという問題があるため、使用する前にその値がnullかどうかを確認する必要があります。次のようなことができます。

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

もちろん、関連するプロパティでそれを行う必要があり、それ以外の場合は正しいタイプを使用する必要がありますstringvalueその後、コントロールのプロパティを直接使用する代わりに変数を使用できます。

于 2013-05-28T13:26:00.687 に答える