0

データベース テーブルの値をドロップダウン リストに入力しました。リストには正しいテーブル データが入力されますが、リスト内のすべての値のインデックスはゼロです。ドロップダウンリストに入力するコードは次のとおりです。

//Get
public ActionResult NewBooking()
{
        var db = new VirtualTicketsDBEntities2();

        IEnumerable<SelectListItem> items = db.Attractions
            .ToList()
            .Select(c => new SelectListItem
          {
              Value = c.A_ID.ToString(),
              Text = c.Name
          });
        ViewBag.Attractions = items;
        return View();
}

ドロップダウン ビュー ページ:

<div class="editor-label">
        @Html.LabelFor(model => model.Attraction)
    </div>
    <div class="editor-field">
        @Html.DropDownList("Attractions")
</div>

たとえば、テーブルに 3 つの値 A、B、C があるとします。これらの値はドロップダウン リストに表示されますが、POST リクエスト関数で選択したインデックスを取得すると、常にゼロが返されます。POST送信関数は次のとおりです。

//Post
    [HttpPost]
    public ActionResult NewBooking(BookingView booking)
    {
        try
        {
            BookingManager bookingManagerObj = new BookingManager();
            bookingManagerObj.Add(booking);
            ViewBag.BookingSavedSucess = "Booking saved!";
            return View("WelcomeConsumer","Home");
        }
        catch
        {
            return View(booking);
        }
    }

booking.Attractionユーザーが 0 より大きいインデックス項目を選択した場合でも、常に 0 です。

助言がありますか?

4

3 に答える 3

0

すでに回答を選択されていることは承知していますが、別の方法をご紹介します。私が始めたとき、ドロップダウンリストにデータを入力する別の方法ASP.NET MVCに苦労し、見つけました。SelectListItemそれ以来、私はこの方法に固執しています。

ビューにバインドするビューモデルを常に持っています。私は決してドメイン モデルを介して送信することはなく、常にビュー モデルを送信します。ビュー モデルは、ドメイン モデルの単なる縮小バージョンであり、複数のドメイン モデルからのデータを含めることができます。

私はあなたのコードとヒントにいくつかの変更を加えましたが、私が述べたように、それはあなたがすでに持っているものに代わるものです.

ドメイン モデルは次のようになります。プロパティ名に意味のある説明を付けてみてください。

public class Attraction
{
     public int Id { get; set; }

     public string Name { get; set; }
}

ビュー モデルは次のようになります。

public class BookingViewModel
{
     public int AttractionId { get; set; }

     public IEnumerable<Attraction> Attractions { get; set; }

     // Add your other properties here
}

コントローラーにデータ アクセス メソッドを持たないでください。代わりに、サービス レイヤーまたはリポジトリでこの機能を公開します。

public class BookingController : Controller
{
     private readonly IAttractionRepository attractionRepository;

     public BookingController(IAttractionRepository attractionRepository)
     {
          this.attractionRepository = attractionRepository;
     }

     public ActionResult NewBooking()
     {
          BookingViewModel viewModel = new BookingViewModel
          {
               Attractions = attractionRepository.GetAll()
          };

          return View(viewModel);
     }

     [HttpPost]
     public ActionResult NewBooking(BookingViewModel viewModel)
     {
          // Check for null viewModel

          if (!ModelState.IsValid)
          {
               viewModel.Attractions = attractionRepository.GetAll();

               return View(viewModel);
          }

          // Do whatever else you need to do here
     }
}

そして、あなたのビューは次のようにあなたのドロップダウンを設定します:

@model YourProject.ViewModels.Attractionss.BookingViewModel

@Html.DropDownListFor(
     x => x.AttractionId,
     new SelectList(Model.Attractions, "Id", "Name", Model.AttractionId),
     "-- Select --"
)
@Html.ValidationMessageFor(x => x.AttractionId)

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

于 2013-07-19T08:54:36.313 に答える
0

を使用しないことをお勧めします。ViewBag常に を使用する必要がありますViewModel

次のようなものがあるViewModelとします:

public class AttractionViewModel
{
    public int AttractionId { get; set; }
    public SelectList Attractions { get; set; }
}

@Html.DropDownListFor(...)ビューの web.config ファイルにまだ含まれていない場合は、ViewModel への完全な名前空間があることを確認します。

@model AttractionViewModel
@using(Html.BeginForm("NewBooking", "ControllerName"))
{
    <div class="editor-label">
        @Html.LabelFor(model => model.AttractionId)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.AttractionId, Model.Attractions)
    </div>
    <input type="submit" value="Submit">
}

HttpGet次のように変更します。

//Get
public ActionResult NewBooking()
{
    var db = new VirtualTicketsDBEntities2();
    var items = db.Attractions.ToList();
    var attractionIdDefault = 0;// default value if you have one
    var vm = new AttractionViewModel {
        AttractionId = attractionIdDefault,// set this if you have a default value
        Attractions = new SelectList(items, "A_ID", "Name", attractionIdDefault)
    }    
    return View(vm);
}

HttpPost ActionResult次のように作成します。

// Post
public ActionResult NewBooking(AttractionViewModel vm)
{
    var attractionId = vm.AttractionId; // You have passed back your selected attraction Id.
    return View();
}

その後、動作するはずです。

于 2013-07-18T17:41:46.587 に答える