Модель Binding MVC3 Razor, Как мне изменить имя входа? - PullRequest
1 голос
/ 08 марта 2012

Я установил привязку базовой модели, передав список в представление и выполнив:

Контроллер:

[Authorize]
public ActionResult AddTracks(int id)
{
    TrackRepository trackRepository = new TrackRepository();
    //ShowTrackAssociationHelper showTrack = new ShowTrackAssociationHelper();

    //showTrack.tracks = trackRepository.GetAssociatedTracks(id).ToList();
    //showTrack.show = showRepository.GetShow(id);
    TracksViewModel tracksModel = new TracksViewModel();
    tracksModel.Tracks = trackRepository.GetAssociatedTracks(id);

    ViewBag.ShowID = id;
    return View(tracksModel);


}

Вид:

 @model BluesNetwork.Models.TracksViewModel
 @Html.EditorFor(model => model.Tracks, "TrackEditor")

Модель TracksView:

public class TracksViewModel
{

    public IEnumerable<Track> Tracks  { get; set; }

}

TackEditor:

 @model BluesNetwork.Models.Track
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)


        @Html.HiddenFor(model => model.TrackID)
        @Html.HiddenFor(model => model.ShowID)

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

        <div class="editor-label">
            @Html.LabelFor(model => model.TrackNumber)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.TrackNumber, new { maxlength = 2 })
            @Html.ValidationMessageFor(model => model.TrackNumber)
        </div>
            @Html.HiddenFor(model => model.HQFileID)
            @Html.HiddenFor(model => model.LQFileID)

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

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


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

        <input type="submit" value="Save" />





}

Сначала я получил:

Что дает мне вывод как таковой на каждом входе:

имя = "[0] .ShowID"

однако я хотел, чтобы это было:

имя = "трек [0] .ShowID"

Я видел примеры / учебные руководства, которые показывают вывод, подобный этому, но они не вдавались в подробности об этом.

После следования совету RPM1984 и внесения изменений я получил ошибку:

Элемент модели, передаваемый в словарь, имеет тип «System.Data.Objects.ObjectQuery`1 [BluesNetwork.Models.Track]», но для этого словаря требуется элемент модели типа «BluesNetwork.Models.Track».

Заранее благодарю за помощь

В

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Не уверен, что вы подразумеваете под "Я установил привязку базовой модели".Это не похоже на подшивку модели, это похоже на шаблон или частичное представление.

В любом случае, двигаясь дальше ....

У вас должна быть ViewModel, подобная этой:

public class TracksViewModel
{
    public IEnumerable<Track> Tracks { get; set; }
}

Главный вид:

@model TracksViewModel
@Html.EditorFor(model => model.Tracks)

Шаблон редактора:

@model Track
@Html.EditorFor(model => model.ShowId)

Нет циклов, нет магических строк.Хорошо.

Что будет отображать HTML следующим образом:

<input type="text" name="tracks[0].ShowId" />
<input type="text" name="tracks[1].ShowId" />
<input type="text" name="tracks[2].ShowId" />

Что вам нужно, верно?

0 голосов
/ 08 марта 2012

В основном, если вы хотите изменить имена, вам нужно добавить немного JavaScript или развернуть свое частичное представление.

Обратите внимание, что изменение идентификаторов и имен связанных полей, вообще говоря, плохая идея, потому что это сломает запеченные в привязке вашей ViewModel. Вам действительно нужно изменить имя?

...