0

i have a problem, i had created a controller and a view for adding a new item from a specific model. the view looks like:

@modelModels.UserItem

@{
    ViewBag.Title = "New";
}

<h2>New</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

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

        <div class="editor-label">
            @Html.LabelFor(model => model.name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.name)
            @Html.ValidationMessageFor(model => model.name)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

and the controller:

[HttpPost]
public ActionResult New(UserItem useritem)
{
    if (ModelState.IsValid)
    {
        db.UserItems.AddObject(useritem);
        db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(useritems);
}

how i want to add a dropdown to the form in the view like this:

<select id="Select1">
    <option>MARS</option>
</select>

how to access the data from the form after it was submitted in the controller?

4

3 に答える 3

6

ページのビュー モデルを用意します。このビュー モデルはビューで使用されます。そのため、本当に必要なモデルのフィールドのみを含めてください。Get アクションでは、このビュー モデルを作成し、モデルから必要なプロパティを取得して、それらをビュー モデルにマップする必要があります。

public class UserItemViewModel
{
    /* Properties you want from your model */
    public string Property1                           { get; set; }
    public string Property2                           { get; set; }
    public string Property3                           { get; set; }

    /* Property to keep selected item */
    public string SelectedItem                        { get; set; }
    /* Set of items to fill dropdown */
    public IEnumerable<SelectListItem> SelectOptions  { get; set; }

    /* Fill the SelectListHere. This will be called from index controller */
    public void FillOptions()
    {
        var items = new[] { "Mars", "Venus" }.
              Select(x => new SelectListItem { Value = x, Text = x });

        SelectOptions= new SelectList(items, "Value", "Text");
    }
}

Model 自体ではなく、ViewModel を受け取るようにコントローラーを変更します。

[HttpPost]
public ActionResult New(UserItemViewModel useritem)
{
    /* Repopulate the dropdown, since the values are not posted with model. */
    userItem.FillOptions();

    if (ModelState.IsValid)
    {
        /* Create your actual model and add it to db */

        // TODO: Map your properties from model to view model.
        // Let's say you created a model with name userItemModel
        db.UserItems.AddObject(userItemModel);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(useritem);
} 

インデックス ビュー コントローラーを少し変更する必要があるかもしれません (ドロップダウンを埋めるため)。

[HttpGet]
public ActionResult Index()
{
    /* Create new viewmodel fill the dropdown and pass it to view */
    var viewModel = new UserItemViewModel();
    viewModel.FillOptitons();

    //TODO : From your model fill the required properties in view model as I mention.

    return View(viewModel);
} 

そしてあなたの見解、

/* Strongly typed view with viewmodel instead of model itself */
@modelModels.UserItemViewModel

/* This is the dropdown */
@Html.DropDownListFor(m => m.SelectedItem, Model.SelectOptions)
于 2012-07-02T07:49:26.917 に答える
0

私はviewModelを持つというemreの提案が好きで、あなたの質問に対する最良の解決策だと思いますが、あなたがそのようにしたくない場合に備えて(それが最善であるため、本当に正当な理由が必要です)、それでも方法が必要ですいつでも使用できるフォームの値に直接アクセスします: var x = Request["myFiledName"]; コントローラー内で、フォームから渡された値を取得します。

于 2012-07-02T08:07:17.047 に答える
0
  1. そのプロパティをモデルに追加します
  2. ビルトインEditorFor(推奨) または手書きの html を使用して、そのプロパティのクライアント側入力を生成します。
  3. ユーザーがフォームを送信するときにそのプロパティを調べて、送信された値にアクセスします
于 2012-07-02T07:45:55.783 に答える