如果我有以下代码(编辑:对不起,如果我不清楚,我想封装以下(忘记查看其调用),以便我可以在{{1 }}):
ActionResult
如何在我的控制器中的不同操作中重复使用它而无需复制/粘贴。我尝试用代码做一个私有方法。但我坚持:
在操作方法中调用错误:public ActionResult ModelBased(string[] items, PostedItems postedItems) {
var model = new ItemsViewModel();
var selectedItems = new List<Item>();
var postedItemIDs = new string[0];
if (postedItems == null) postedItems = new PostedItems();
if (items!= null && items.Any()) {
postedCityIDs = items;
postedItems.ItemIDs = items;
}
if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) {
postedItemIDs = postedIems.ItemIDs;
model.WasPosted = true;
}
if (postedItemIDs.Any())
selectedItems = ItemRepository.GetAll()
.Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList();
model.AvailableItems = ItemRepository.GetAll();
model.SelectedItems = selectedItems;
model.PostedItems = postedItems;
return View(model);
}
然后在操作中调用private void Item (Item item) {//copied code from above}
;或
它与Item(item);
有关,我做错了;或
完全不同的是我做得不对。
非常感谢任何例子。
编辑:上面的代码适用于CheckBoxList。这是一个特定的CheckBoxList。但我希望能够在其他视图中使用它,而无需将代码复制/粘贴到其他(string[] items, PostedItems postedItems)
。只是调用ActionResults
将无效,因为我打算做其他事情。特别是,我在每个ActionResult
中都有向导代码,例如:
ActionResult
正在返回特定视图,因此只有if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("EMailConfirm");
return View("EMail/BasicDetails", myData);
的调用才会起作用,除非我遗漏了某些内容。
答案 0 :(得分:1)
return View(model);
尝试查找原始操作的视图。
指定return View("ModelBased", model);
以始终呈现名为"ModelBased"
public void SomeAction(string[] items, PostedItems postedItems)
{
// Modify the data as your like
return ModelBased(string[] items, PostedItems postedItems);
}
public void SomeOtherAction(string[] items, PostedItems postedItems)
{
// Modify the data as your like
return ModelBased(string[] items, PostedItems postedItems);
}
private ActionResult ModelBased(string[] items, PostedItems postedItems) {
var model = new ItemsViewModel();
var selectedItems = new List<Item>();
var postedItemIDs = new string[0];
if (postedItems == null) postedItems = new PostedItems();
if (items!= null && items.Any()) {
postedCityIDs = items;
postedItems.ItemIDs = items;
}
if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) {
postedItemIDs = postedIems.ItemIDs;
model.WasPosted = true;
}
if (postedItemIDs.Any())
selectedItems = ItemRepository.GetAll()
.Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList();
model.AvailableItems = ItemRepository.GetAll();
model.SelectedItems = selectedItems;
model.PostedItems = postedItems;
return View(model);
}
答案 1 :(得分:0)
您的示例不清楚,但是,我通常会将常用功能移到单独的方法中并使用[NonAction]属性进行标记。 E.g。
[NonAction]
protected UserInfo GetUserInfo(string username)
{
// Return relevant data
}
然后我会在你的动作方法中调用GetUserInfo。
修改强>
您需要查看部分视图。您可以将局部视图视为可以在多个页面上重复使用的控件。例如,我可以在部分视图中放置登录控件并在多个页面上重新登录。这将促进代码的可重用性。
我不能给你一个例子,因为我暂时没有这样做,但你必须做以下事情:
return View();
,您必须return PartialView("_NameOfYourPartialView", viewModel);
你需要做一些阅读并亲自试试。
祝你好运答案 2 :(得分:0)
您可以从另一个返回ActionResult
的操作中调用此操作。
public ActionResult OtherAction()
{
return ModelBased(items, postedItems);
}
另外,为什么private void
?您真正想要重用哪一部分?如果需要Item
并返回ItemsViewModel
,则应为private ItemsViewModel
- 取决于您要重复使用的部分。 void
不返回任何内容。