Asp.net mvc MVC:从我的控制器的其他区域调用动作方法到我的视图
我首先使用MVC Viewmodel EF模型,我尝试在我的视图中创建两个表单,一个用于创建,另一个用于删除。 但是我不能让它工作。。。我得到这个错误: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中有
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");