0

コントローラ:

    public ActionResult Edit(int id)
    {
        SetViewData();
        var rule = _db.AlertRules.Find(id);

        ViewData["rule"] = rule.Feed.Name + " - "
            + rule.Template.Name;
        return View(rule);
    }

    //
    // POST: /AlertRule/Edit/5
    [HttpPost]
    public ActionResult Edit(AlertRule alertrule)
    {
        SetViewData();
        alertrule.UpdateDateTime = DateTime.Now;
        if (ModelState.IsValid)
        {
            _db.Entry(alertrule).State = EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        else
        {
            TempData["error"] = "Cant update rule({0})"
                + alertrule.Id;
        }

        return View(alertrule);
    }

    private void SetViewData()
    {
            var feeds = new SelectList(_db.Feeds.OrderBy(f => f.Name), "Id", "Name");
            var templates = 
                 new SelectList(_db.AlertRuleTemplates.OrderBy(f => f.Name), "Id", "Name");

            ViewData["templates"] = templates;
            ViewData["feeds"] = feeds;
    }

見る:

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
    <legend>Edit</legend>
    @Html.HiddenFor(model => model.Id)

    <div class="editor-label">
        @Html.LabelFor(model => model.FeedId)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.FeedId, (SelectList)ViewData["feeds"])
        @Html.ValidationMessageFor(model => model.FeedId)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.TemplateId)
    </div>

    <div class="editor-field">
        @Html.DropDownListFor(model => model.TemplateId, 
              (SelectList)ViewData["templates"])
        @Html.ValidationMessageFor(model => model.TemplateId)
    </div>

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

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

    <div class="editor-label" style="display: none">
        @Html.LabelFor(model => model.UpdateDateTime)
    </div>
    <div class="editor-field" style="display: none">
        @Html.EditorFor(model => model.UpdateDateTime)
        @Html.ValidationMessageFor(model => model.UpdateDateTime)
    </div>

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

フォームデータ:

Id:33
FeedId:1
TemplateId:1
Enable:false
Alertrule:00000
UpdateDateTime:12/10/2012 3:02:15 PM
4

1 に答える 1

3

それはよくある落とし穴です。Alertruleモデルにアクション引数名と競合するプロパティがあるようです。したがって、アクション引数の名前を変更します。

[HttpPost]
public ActionResult Edit(AlertRule model)

またはAlertRule、競合を避けるためにプロパティ名の名前を変更します。

問題は次のプロパティです。

Alertrule:00000

00000アクション引数は同じ方法で呼び出されるため、デフォルトのモデルバインダーは値をパラメーターにバインドしようとしますが、alertRuleこれは明らかに失敗します。

于 2012-12-10T08:52:47.800 に答える