1

動的ビューを使用してレコードを表示および編集しています。

モデル A があるとします。

public class A
{
    public int AID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int organizationid { get; set; }
}

そしてクラスB:

public class B
{
    public int organizationid { get; set; }
    public string orgnmae { get; set; }
    public string orgdesc { get; set; }
}

ここで、テーブル B の organizationid は、テーブル A の外部キーです。

これで、動的エディター ビューができました。

@model dynamic
@using (Html.BeginForm("Edit", null,  FormMethod.Post))
 {
   @Html.EditorForModel()

 <input type="submit" value="Edit" />
}

A のレコードを編集することを選択すると、このエディター ビューにすべてのテキスト ボックスが表示されます。しかし、organizationid については、整数値を表示すべきではありません。代わりに、テーブル B の利用可能な組織のドロップダウンを表示する必要があり、ユーザーはそのうちの 1 つを選択して編集できます。

どうすればこれを処理できますか? ここでダーリンの回答を読みました。それは良い提案ですが、私の場合、ドロップダウン項目は別のモデルの一部である必要があります。

4

3 に答える 3

1

あなたが提案している方法でこの問題に取り組んでいた場合は、A に変更を加えます。ビューモデルを使用しない場合は、そのプロパティを拡張する必要があります。

public class A
{

    [ScaffoldColumn(false)]
    public int OrganizationId { get; set; }


    [Display(Name="OrganizationId")]
    [UIHint("DropDownList")]
    public IEnumerable<SelectListItem> Organizations { get; set; }
}

値が OrganizationId としてモデル バインディングにフィードバックされるように、Organizations の name フィールドをオーバーライドしたことがわかります。このモデルを構築するとき、関連する組織インスタンスからの selectlistitems のリストまたは配列として組織プロパティを作成する必要があります。

また、元の組織 ID をスキャフォールディングしないように設定したので、レンダリング プロセスに参加しなくなることを願っています。

もちろん、editortemplates でテンプレート DropDownList を作成する必要があります。

HTH

于 2013-07-16T08:32:44.333 に答える
0

こんにちは、このように試してください

モデル

  public class CustomerModel
    {
        public int CustomerId { get; set; }

        public string customerName { get; set; }
}

意見

@model dynamic
@{
    Layout = null;
}

 @Html.DropDownList("CustomerId", (SelectList) ViewBag.CustomerNameID,"--Select--")

コントローラー

[HttpGet]
        public ActionResult CustomerInfo()
        {

            var List = GetCustomerName();
            ViewBag.CustomerNameID = new SelectList(List, "CustomerId", "customerName");
            return View();
        }
于 2013-07-17T06:55:07.403 に答える
0

あなたの質問を正しく理解しているかどうかはよくわかりません。EditorForビューモデルからフィールドを直接追加するだけです。それは私にもっとコントロールを与えます。class A私が収集できることから、編集しclass Bてドロップダウンリストに入れたいと思われますか?

これが私が定義class Aclass B、あなたのプロパティの名前を与える方法です。間違っていたらすみません。class A is class Userclass B is class Organization。人々が読みやすいように、プロパティをより適切に説明する必要があります。

public class User
{
     public int UserId { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int OrganizationId { get; set; }
}

public class Organization
{
     public int OrganizationId { get; set; }

     public string OrganizationName { get; set; }

     public string OrganizationDescription { get; set; }
}

ビューでデータを表現するには、ビュー モデルが必要です。

public class EditUserViewModel
{
     public int UserId { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int OrganizationId { get; set; }

     public IEnumerable<Organization> Organizations { get; set; }
}

public ActionResult Edit(int id)
{
     // Get the user by id
     User user = userRepository.GetById(id);

     // You can use a mapping tool here to map from domain model to view model.
     // I did it differently for the sake of simplicity

     EditAViewModel viewModel = new EditAViewModel
     {
          UserId = user.UserId,
          FirstName = user.FirstName,
          LastName = user.LastName,
          OrganizationId = user.OrganizationId,
          Organizations = organizationRepository.GetAll()
     };

     // Return the populated view model to the view    
     return View(viewModel);
}

[HttpPost]
public ActionResult Edit(EditAViewModel viewModel)
{
     if (!ModelState.IsValid)
     {
          viewModel.Organizations = organizationRepository.GetAll();

          return View(viewModel);
     }

     // If validation succeeds do what ever you have to do here, like edit in database
}

そして、これがあなたのビューがどのように見えるかです。

@model YourProject.ViewModels.Users.EditUserViewModel

@using (Html.BeginForm())
{
     <table>
          <tr>
               <td class="edit-label">First Name:</td>
               <td>
                    @Html.TextBoxFor(x => x.FirstName)
                    @Html.ValidationMessageFor(x => x.FirstName)
               </td>
          </tr>
          <tr>
               <td class="edit-label">Last Name:</td>
               <td>
                    @Html.TextBoxFor(x => x.LastName)
                    @Html.ValidationMessageFor(x => x.LastName)
               </td>
          </tr>
          <tr>
               <td class="edit-label">Organization:</td>
               <td>
                    @Html.DropDownListFor(
                         x => x.OrganizationId,
                         new SelectList(Model.Organizations, "OrganizationId", "OrganizationName", Model.OrganizationId),
                         "-- Select --"
                    )
                    @Html.ValidationMessageFor(x => x.OrganizationId)
               </td>
          </tr>
     </table>

     <button id="SaveButton" type="submit">Save</button>
}

これが私のやり方です。シナリオに合わせてコードを変更できます。

これが役立つことを願っています。

于 2013-07-16T06:47:40.840 に答える