1

私のアプリケーションには、さまざまな選択肢を表すドロップダウンリストがあります。これParagraphはモデルであり、セクションはモデル内の1つのフィールドにすぎないことに注意してください。

@Html.DropDownList("Sections")

そして、これが私のコントローラーです。

public ActionResult Edit(int id)
{
    var paragraph = db.Paragraphs.Find(id);

    ViewBag.Sections = new SelectList(
        db.Sections.Select(s => new { s.ID, s.Name }),
        "ID", "Name", paragraph.SectionID
    );

    return View(paragraph);
}

[HttpPost]
public ActionResult Edit(Paragraph paragraph, HttpPostedFileBase document)
{
    if (ModelState.IsValid)
    {
        // Do some stuff.
    }

    ViewBag.Sections = new SelectList(
        db.Sections.Select(s => new { s.ID, s.Name }),
        "ID", "Name", paragraph.SectionID
    );

    return View(paragraph);
}

ドロップダウンリストがモデルにバインドされていませんが、フォームを送信すると。ModelState.IsValid虚偽を引き起こし、私の人生を恐ろしいものにします。助言がありますか?

編集:フォームを送信すると、次のエラーが発生します:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sections'.

編集:ファイルを送信しようとすると、前述のエラーのみが発生するようです。

編集:モデル

public class Paragraph
{
    public int ID { get; set; }

    [Required]
    public int Major { get; set; }

    [Required]
    public int Minor { get; set; }

    [Required(ErrorMessage = "Name is required")]
    [StringLength(4000)]
    public string Name { get; set; }

    public int SectionID { get; set; }
    public virtual Section Section { get; set; }
}

フォーム:(たくさんあります。)

<form class="form-horizontal" action="/Paragraph/Edit" method="post" enctype="multipart/form-data">
    <fieldset>
        <div class="control-group">
            <label class="control-label" for="section">Section</label>
            <div class="controls">
                @Html.DropDownList("Sections")
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="major">Major</label>
            <div class="controls">
                <input type="number" class="input-large" name="major" value="@Model.Major" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="minor">Minor</label>
            <div class="controls">
                <input type="number" class="input-large" name="minor" value="@Model.Minor" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="name">Name</label>
            <div class="controls">
                <input type="text" class="input-large" name="name" value="@Model.Name" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="document">Document</label>
            <div class="controls">
                <input type="file" class="input-file" name="document" />
            </div>
        </div>
        <div class="form-actions">
            <input type="submit" class="btn btn-primary" value="Save" />
            <a class="btn" href="/Paragraph/Show/@Model.ID">Cancel</a>
        </div>
    </fieldset>
</form>
4

5 に答える 5

1

HTML コードを次のように変更します。

@Html.DropDownListFor(m => m.SectionID, ViewBag.Sections as SelectList)

このページのモデルがない場合は、次のコードを使用してください。

@Html.DropDownList("Sections", ViewBag.Sections as SelectList)
于 2012-04-16T01:20:05.580 に答える
1

Html.TextBoxFor などの強力な型のヘルパーを使用していないのはなぜですか? 必要に応じて、オプションの html 属性を渡すことができます

私はあなたのドロップダウンリストを作ります

@Html.DropDownListFor(model =>model.SectionID,(IEnumerable<SelectListItem>) ViewBag.Sections) 

その他

@Html.HiddenFor(model =>model.ID)
@Html.TextBoxFor(model =>model.Name)
@Html.TextBoxFor(model =>model.Major)
@Html.TextBoxFor(model =>model.Minor)

ファイルは<input type="file" class="input-file" name="document" />

これにより、バインドするモデルが得られます。正しい名前などを確実に取得できます。また、フォームの一部として ID を含めています。

于 2012-04-15T21:47:18.457 に答える
0

これは遅いですが、遅くならないよりはましです。提供されるヘルパーの 1 つを使用すると、裏で名前HtmlHelperが生成されます。inputこの名前の生成形式はModel.Field. たとえば、「名前」というフィールドを持つ段落は になりParagraph.Nameます。

1 つのパラメーターを受け入れるの定義でDropDownListは、ドロップダウン リストの名前をその名前として使用しinputます。したがって、 を呼び出すと、「Sections」という名前のDropDownList("Sections")が作成されます。input

しかし最終的には、Razor に譲歩し、組み込みの HTML ヘルパーを使用することにしました。したがって、ドロップダウン リストのコードは次のようになりますDropDownListFor(vm => vm.Paragraph.SectionID, Models.Sections)

于 2012-04-26T00:14:37.247 に答える
0

とても奇妙!以前使っていた

@Html.DropDownList("permissionsID", String.Empty)

そしてそれはうまくいきました-突然、同じ問題が発生しました。ddl は、Create (posted) コントローラー メソッドで選択した値を送信していません)

だから私は使った

@Html.DropDownListFor(model => model.permissionID, (IEnumerable<SelectListItem>)ViewBag.permissionsID)

そしてそれはうまくいきました!

ただし、古い方法を使用して今日まで動作する古いコントローラーがあります-新しいコントローラーには気に入らないだけです!

それは本当に論理に反しています...

于 2013-01-21T15:25:09.190 に答える
0

カスケードドロップダウンリストを実行するときに、友人に同じ問題がありました

親ドロップダウンリストをバインドする理由はありません。だから私がしたことは、すぐに同じ方法で親ドロップダウンリストを埋めることでした. アクションを作成し、json で呼び出し、jquery を使用して入力しました。

コントローラーでの私のアクション:

public ActionResult GetStates()
    {
        if (Request.IsAjaxRequest())
        {
            using (MyModel banco = new myModel())
            {

                return Json(new SelectList(banco.SyStates.ToList(), "StateId", "StateName"), JsonRequestBehavior.AllowGet);

            }
        }
        return View();

    }

景色:

      <select id="StateList" name="StateList"></select> 

<script>

   $(document).ready(function () {



         var URL = "/ControllerName/GetStates";
         $.getJSON(URL, function (data) {



         var items = '<option>Selecione o estado</option>';
         $.each(data, function (i, State) {
             items += "<option value='" + State.Value + "'>" + State.Text + "</option>";
             // state.Value cannot contain ' character. We are OK because state.Value = cnt++;

         });
         $('#StateList').html(items);
         //$('#CitiesTrID').show();

     })

 });

カスケードの例を入手: http://blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx

于 2014-02-27T23:38:26.790 に答える