MVC: вызов методов действия из других областей моего контроллера на мой взгляд beginform - PullRequest
0 голосов
/ 29 февраля 2012

Я использую модель MVC-Viewmodel EF. Сначала я пытаюсь создать 2 формы в своем View, одну для CREATE и другую для DELETE. Но я не могу заставить его работать ... Я получаю эту ошибку:

 There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sname'.

Я думаю, что это происходит из-за того, что у меня есть этот код в моем DeleteSubjectType для выпадающего списка, и он должен быть там, так как я использую 2 формы. Каким-то образом действие DeleteSubjectType не работает в моей форме.

Буду признателен, если кто-нибудь посмотрит на мой код:

Это мой контроллер с моими действиями, которые я хочу использовать в своем представлении beginforms:

public ActionResult CreateSubjectType()
{
    CreateViewModel model = new CreateViewModel();
    return View(model);
}
[HttpPost]
public ActionResult CreateSubjectType(CreateViewModel model)
{
    if (ModelState.IsValid)
    {
        SubjectType s = new SubjectType();
        s.Sname = model.Sname2;                            
        Arep.addsubject(s);
        Arep.save();
        return RedirectToAction("CreateSubjectType");
    }
    return View(model);
}


public ActionResult DeleteSubjectType(int id)
{
    CreateViewModel model = new CreateViewModel();
    List<SubjectType> subjectypes = Arep.getallS();
    model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");

    SubjectType SubjectTypeToDelete = Arep.getbysid(id);
    return View(model);
}

[HttpPost]
public ActionResult DeleteConfirmed2(int id)
{
    SubjectType SubjectTypeToDelete = Arep.getbysid(id);
    Arep.DeletSubjects(SubjectTypeToDelete);
    Arep.save();
    return RedirectToAction("Index");

}

Это мой взгляд:

@model NKI3.ViewModels.CreateViewModel
@using (Html.BeginForm("CreateSubjectType","Admin",FormMethod.Post))
{

    @Html.ValidationSummary(true)
        <fieldset>
        <legend>Skapa ny utvärderingsobjekt</legend>
        <div class="editor-label">
        @Html.LabelFor(model => model.Sname2, "Välj ny utvärderingsobjekt")
        </div>
        <div class="editor-field">
        @Html.EditorFor(model => model.Sname2)
        @Html.ValidationMessageFor(model => model.Sname2)
        </div>
        <p>
        <input type="submit" value="Lägg till" />
        </p>
        </fieldset>

    }  
         @using (Html.BeginForm("DeleteSubjectType","Admin",FormMethod.Post))
         {   

            <fieldset>  
            <legend>Ta bort utvärderingsobjekt</legend>
            <div class="editor-label">
            @Html.LabelFor(model => model.Sname, "Befintliga Utvärderingsobjekt")
            </div>
            <div class="editor-field">
            @Html.DropDownListFor(f => f.Sname, Model.SubjectTypes)
            @Html.ValidationMessageFor(model => model.Sname)
            </div>
            <p>
            <input type="submit" value="Ta bort" />
            </p>    
            </fieldset>
         }

    <div>
        @Html.ActionLink("Tillbaka", "Index")
    </div>

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Из вашего вопроса неясно, с каким из двух показанных вами действий GET связано это представление: это действие CreateSubjectType или действие DeleteSubjectType? Или даже какое-то другое действие, которое вы не показали?

Если мы считаем, что это CreateSubjectType.cshtml, то у вас возникла проблема, поскольку в этом представлении вы пытаетесь создать раскрывающийся список в форме удаления для свойства Sname. За исключением того, что в вашем CreateSubjectType вы никогда не инициализировали свойство SubjectTypes вашей модели представления для SelectList, как это было в действии DeleteSubjectType.

Поэтому убедитесь, что вы правильно инициализируете это свойство:

public ActionResult CreateSubjectType()
{
    CreateViewModel model = new CreateViewModel();
    List<SubjectType> subjectypes = Arep.getallS();
    model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");
    return View(model);
}

Также ваша форма удаления, похоже, отправляет сообщение на действие DeleteSubjectType:

@using (Html.BeginForm("DeleteSubjectType","Admin",FormMethod.Post))

кроме того, что на вашем контроллере я вижу:

[HttpPost]
public ActionResult DeleteConfirmed2(int id)

вместо:

[HttpPost]
public ActionResult DeleteSubjectType(int id)

что, я полагаю, вы были вынуждены сделать, чтобы избежать конфликта разрешения перегрузки, который вы имели с действием GET с тем же именем. В этом случае вы можете сделать это:

[HttpPost]
public ActionResult DeleteSubjectType(int id, FormCollection fc)
0 голосов
/ 29 февраля 2012

Я думаю, что вы немного неправильно понимаете MVC.Ошибка, которую вы получаете, происходит в этой строке:

@Html.DropDownListFor(f => f.Sname, Model.SubjectTypes)

И причина в том, что вы не заполняете Model.SubjectTypes при рендеринге представления.Поэтому я расскажу вам, как система интерпретирует ваш код:

На ваш контроллер поступил запрос на действие "CreateSubjectType".Вы устанавливаете модель на новый CreateViewModel и возвращаете представление, которое вы перечислили.Когда представление отображается, Model.CreateSubjectType имеет значение null.Вы можете отладить и установить точку останова на строке, которую я показал вам выше, чтобы убедиться в этом.Чтобы выпадающий список работал, вам нужно переместить эти две строки в действие CreateSubjectType:

List<SubjectType> subjectypes = Arep.getallS();
model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");

Теперь, как вы это делаете, это действие выполняется только после того, как вы ВЫСТАВЛИТЕ форму Delete.

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