Asp.net mvc MVC:从我的控制器的其他区域调用动作方法到我的视图

Asp.net mvc MVC:从我的控制器的其他区域调用动作方法到我的视图,asp.net-mvc,asp.net-mvc-3,entity-framework,view,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,View,我首先使用MVC Viewmodel EF模型,我尝试在我的视图中创建两个表单,一个用于创建,另一个用于删除。 但是我不能让它工作。。。我得到这个错误: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sname'. 没有具有键“Sname”的“IEnumerable”类型的ViewData项。 我认为这种情况会发生,因为我的DeleteSubjectType中有

我首先使用MVC Viewmodel EF模型,我尝试在我的视图中创建两个表单,一个用于创建,另一个用于删除。 但是我不能让它工作。。。我得到这个错误:

 There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sname'.
没有具有键“Sname”的“IEnumerable”类型的ViewData项。
我认为这种情况会发生,因为我的DeleteSubjectType中有dropdownlist的代码,它应该在那里,因为我使用了2个表单。不知何故,动作DeleteSubjectType在我的表单中不起作用

如果有人能看看我的代码,我将不胜感激:

这是我的控制器,包含我要在视图中使用的操作:

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");

}
public ActionResult CreateSubjectType()
{
CreateViewModel模型=新建CreateViewModel();
返回视图(模型);
}
[HttpPost]
公共操作结果CreateSubjectType(CreateViewModel模型)
{
if(ModelState.IsValid)
{
SubjectType s=新SubjectType();
s、 Sname=model.Sname2;
Arep.添加主题;
Arep.save();
返回重定向到操作(“CreateSubjectType”);
}
返回视图(模型);
}
public ActionResult DeleteSubjectType(int id)
{
CreateViewModel模型=新建CreateViewModel();
List subjectypes=Arep.getall();
model.SubjectTypes=新的选择列表(SubjectTypes,“SID”、“Sname”);
SubjectType SubjectTypeToDelete=Arep.getById(id);
返回视图(模型);
}
[HttpPost]
public ActionResult DeleteConfirmed2(内部id)
{
SubjectType SubjectTypeToDelete=Arep.getById(id);
Arep.委托对象(受委托类型为删除);
Arep.save();
返回操作(“索引”);
}
我的看法是:

@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>
@model NKI3.ViewModels.CreateViewModel
@使用(Html.BeginForm(“CreateSubjectType”、“Admin”、FormMethod.Post))
{
@Html.ValidationSummary(true)
斯卡帕纽约乌特沃德林索布杰克特酒店
@LabelFor(model=>model.Sname2,“Välj ny utvärderingsobjekt”)
@EditorFor(model=>model.Sname2)
@Html.ValidationMessageFor(model=>model.Sname2)

} @使用(Html.BeginForm(“DeleteSubjectType”、“Admin”、FormMethod.Post)) { 塔博特乌特沃德林索布杰克特酒店 @LabelFor(model=>model.Sname,“Befintliga Utvärderingsobjekt”) @DropDownListFor(f=>f.Sname,Model.SubjectTypes) @Html.ValidationMessageFor(model=>model.Sname)

} @ActionLink(“Tillbaka”,“Index”)

提前谢谢

从您的问题来看,不清楚您显示的两个GET操作中的哪一个与此视图相关:是
CreateSubjectType
操作还是
DeleteSubjectType
操作?或者甚至是其他一些你没有表现出来的动作

如果我们认为是<代码> CurraseBujdType .cSHTML,那么您就有问题了,因为在这个视图中,您试图在Delphi表单中创建一个DROPPDROW列表,用于<代码> Sname <代码>属性。除了在

CreateSubjectType
中,您从未像在
DeleteSubjectType
操作中那样将视图模型的
SubjectTypes
属性初始化为SelectList之外

因此,请确保正确初始化此属性:

public ActionResult CreateSubjectType()
{
    CreateViewModel model = new CreateViewModel();
    List<SubjectType> subjectypes = Arep.getallS();
    model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");
    return View(model);
}
除了你的控制器上我看到:

[HttpPost]
public ActionResult DeleteConfirmed2(int id)
而不是:

[HttpPost]
public ActionResult DeleteSubjectType(int id)
我猜您是被迫这样做的,以避免与同名GET操作之间的重载解决冲突。在这种情况下,您可以执行以下操作:

[HttpPost]
public ActionResult DeleteSubjectType(int id, FormCollection fc)

我觉得你有点误解了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");
List subjectypes=Arep.getall();
model.SubjectTypes=新的选择列表(SubjectTypes,“SID”、“Sname”);

按照现在的方式,此操作仅在发布删除表单后执行。

什么意思它不起作用?这太含糊了,也没有给那些看起来需要处理的人太多东西。这是CreateSubjectType.Cshtml,我在DeletSubjectType中键入它的原因是因为用户需要选择一个值然后删除它,它与创建操作无关,我在这里想错了吗?我试图将视图模型的SubjectTypes属性初始化为SelectList,但是我不知道如何处理DELETE POST,因为我希望这两个表单都在我的CreateSubjectType.cshtml中工作view@RammtinAvar,我不明白你的问题。删除帖子有什么问题。您应该按照我在回答中解释的那样重命名它,或者修改Html.BeginForm帮助程序以指向正确的操作名称。另外,您似乎正在重定向到
索引
,但我在您的控制器中没有看到索引操作。也许你的意思是重定向到
CreateSubjectType
?我刚看到你的编辑,是的,我更改了我的删除帖子的名称。正如你所说,我已经改变了一切。当我运行调试并尝试删除SubjectType时,我收到了以下错误:“参数字典”包含“NKI3.Controllers.AdminController”中方法“System.Web.Mvc.ActionResult DeleteSubjectType(Int32,System.Web.Mvc.FormCollection)”的非空类型“System.Int32”的参数“id”的空条目。任选的票面金额
List<SubjectType> subjectypes = Arep.getallS();
model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");