1

私はasp.net mvc3プログラミングが初めてで、特定のフォームを構築しようとしています。ユーザーフィールド(私が持っている)だけでなく、オブジェクトのリスト(その場合はSStatus)を含むフォームが必要です。


私のフォーム:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Création d'utilisateur</legend>

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

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

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

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

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

        <p>Status</p>
        @{

//エラーはここにありました

                @{
                    var list = ViewBag.listStatus as List<SStatus>;
                }
                @if (list != null)
                {
                    foreach(var status in list)
                    {
                        <option value=@status.ID>@status.Name</option> 
                    }
                }
            </select>
        }

        <p>
            <input type="submit" value="Création" />
        </p>
    </fieldset>
}

リスト呼び出し:


public ActionResult CreateUserView()
        {
            RestClient client = new RestClient(Resource.Resource.LocalUrlService);
            RestRequest request = new RestRequest("/status/all", Method.GET);
            var response = client.Execute(request);
            if(response.StatusCode == HttpStatusCode.OK)
            {
                List<SStatus> listSatus = JsonHelper.FromJson<List<SStatus>>(response.Content);
                ViewBag.listStatus = listSatus;
            }
            return View();
        }

そしてフォーム投稿:


     [HttpPost]
            public ActionResult CreateUserView(Uuser userToCreate, string list)
            {
//list got the ID of SStatus. 
                if (ModelState.IsValid)
                {//Stuff}
    }

質問は次のとおりです。選択したリスト項目を取得する方法は?

よろしく。

4

1 に答える 1

1

ビュー モデル パターンを使用します。オブジェクトがビューにUuserどのように送信されるかはまだわかりません(デフォルトのアクションを介してですが、何を達成しようとしているのかがわかると思います)。この方法でリファクタリングすると、組み込みの検証、自動モデルバインディングなどで。[HttpGet]

public class CreateUserViewModel
{
    public Uuser User { get; set; }
    public string Status { get; set; }
}

次に、アクションパラメーターは次のタイプにする必要がありますCreateUserViewModel

[HttpPost] 
public ActionResult CreateUserView(CreateUserViewModel vm)
{
    if(ModelState.IsValid)
    {
        {//Stuff}
}

投稿するには、要素にname属性が必要になると思います。<select>

<p>Status</p>
    @{
        <select name="Status">

ただし、モデルが有効でない場合、問題が発生します。CreateUserViewModelあなたのビューは、例えばに対して強く型付けされるべきです

@model YourModelNamespace.CreateUserViewModel

したがって、Lastnameプロパティは次のようになります ( に注意してください.User)

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Création d'utilisateur</legend>

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

そして最後に、ViewBag にステータスの可能なリストを保持できると思いますが、選択した値を に設定する必要があります@Model.Status。コントローラーから入力できるに変更CreateUserViewModel.Statusすることを検討することをお勧めします。List<SelectListItem>GETreturn View(CreateUserViewModel)

public ActionResult CreateUserViewModel()
{
    CreateUserViewModel vm = new CreateUserViewModel();
    vm.User = // set user
    vm.Status = new List<SelectListItem>()
    {
        new SelectListItem()
        {
            Value = "status1",
            Text = "status 1",
            Selected = false
        },
        new SelectListItem()
        {
            Value = "status2",
            Text = "status 2",
            Selected = true
        },
    };

    return View(vm); // this is the correct way to strongly type your view
}
于 2012-07-11T14:42:53.283 に答える