0

困っていますので、よろしくお願いします。

簡単なクラスがあります

public class Test
{
    [Key]
    public string a { get; set; }

    [Required]
    public string c { get;set; }

    public string b { get; set; }
}

新しいエンティティインスタンスを送信するための簡単なフォームを作成しましたが、機能します。編集に問題があります。編集フォームに「a」と「b」のプロパティが表示されます。'c'は新しいエンティティでのみ送信でき、表示してはならないため(理由を尋ねないでください)、私の更新方法では次のようになります。

public ActionResult Edit(Test t)
{
    if (ModelState.IsValid)
    {
     //get the m instance
      UpdateModel(m,//other params);
      ValidateModel(m);
    }
    //saving code
}

明らかModelState.IsValidに常にfalseであり(「c」が必要であるためですが、nullでUpdateModelあるため)、例外をスローします(同じ理由で)。「このコントローラーメソッドでのみ、このフィールドを検証しないでください」とMVC3にどのように言うことができますか?明らかに、私はモデルクラスに未検証のフィールドを書きません!'b'プロパティのみを更新する必要があります。ありがとうございました。

4

4 に答える 4

2

最も簡単な方法は、この部分ビュー用に別のビュー モデルを作成することです。

于 2012-05-16T11:50:02.317 に答える
1

このビューの別のビューモデルを作成し、エンティティの代わりにそのビューモデルに対して検証します。

于 2012-05-16T11:53:26.877 に答える
0

フォームが編集モードの場合、コントローラーで評価する「デフォルト」値を使用して、フィールドを非表示のプロパティにします。フォームにプロパティをまったく表示せずに必要な場合は、「ModeState.IsValid」を使用せずに独自の検証を行う必要があります。

非表示になっているプロパティの例:

コントローラ

    public ActionResult Index() {
        return View();
    }

    public ActionResult Edit(string id) {
        return View((string.IsNullOrEmpty(id)) ? new Test { a = "new" } : FakeRepository.Data(id));
    }

    [HttpPost]
    public ActionResult Edit(Test model) {
        if (ModelState.IsValid) {
            if (model.a == "new") {
                //Create a new record
            } else {
                //Update Record
            }
            return RedirectToAction("Index");
        }
        return View(model);
    }

    public static class FakeRepository {
        public static Test Data(string a) {
            return new Test {
                a = a,
                b = "B",
                c = "C"
            };
        }
    }

実在物

public class Test {
    [Key]
    [Display(Name="A Property")]
    public string a { get; set; }

    [Required]
    [Display(Name = "C Property")]
    public string c { get; set; }

    [Display(Name = "B Property")]
    public string b { get; set; }
}

意見

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Test</legend>

        @Html.HiddenFor(model => model.a)       


        @if (Model.a != "new") { 
            @Html.HiddenFor(model => model.c)
        } else { 
            <div class="editor-label">
                @Html.LabelFor(model => model.c)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.c)
                @Html.ValidationMessageFor(model => model.c)
            </div>
        }    

        <div class="editor-label">
            @Html.LabelFor(model => model.b)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.b)
            @Html.ValidationMessageFor(model => model.b)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

.../編集/何かが「C」を非表示にします

.../編集/「C」が表示されます

于 2012-05-17T13:42:55.170 に答える
0
 @{
   object htmlAttribute = null;
   if(Model.Id > 0)
   {
       htmlAttribute = new { disabled = "disabled" };
   }
 }

 @Html.TextBoxFor(model => model.C, htmlAttributes)

無効にすると、C は検証されません

于 2012-05-16T12:56:19.410 に答える