mvc替代为多个视图和控制器使用if-else

时间:2014-09-29 15:19:14

标签: c# asp.net-mvc asp.net-mvc-4 code-duplication

我想创建一个模型 - 视图 - 控制器,不需要if-else用于单独的控件,或者必须复制这些控件来处理不同的屏幕控制。
目前我有: -

//控制器

public ActionResult DisplayThing1(int thingType, string thingName){

  Thing1Model model = new Thing1Model();
  return View(model);
}

[HttpPost]
public ActionResult DisplayThing1(Thing1Model model)
{
  Save(model);
  return RedirectToAction("DisplayThing1");
}

// model

public class Thing1Model()
{
 public int type {get; set; }
 public string Name {get; set;}
}

//查看

@using(Html.BeginForm(....))
{
 @Html.HiddenFor(m=>m.type);
 @Html.LabelForI(m=>m.Name);
}

我有Thing2Model的重复控制器,模型本身是

public class Thing2Model()
{
 public int type {get; set; }
 public string Name {get; set;}
 public DateTime MyDate {get; set;}
}

组合视图如下所示。

@using(Html.BeginForm(....))
{
 @Html.HiddenFor(m=>m.type);
 @Html.LabelForI(m=>m.Name);
 @if(type == "2")
 {
   @Html.TextBoxFor(m=>m.MyDate);
 }
}

我正在寻找一个更好的选择来避免@if以及重复的代码

编辑: 添加到@ W92答案。我们还需要更改模型绑定器以支持继承的模型。 否则,在此代码的视图中,MVC不会理解如何放置子属性。

Polymorphic model binding

1 个答案:

答案 0 :(得分:1)

我完全不了解你的问题,但非常好,很抱歉任何错误。

public class Thing1Model()
{
 public int type {get; set; }
 public string Name {get; set;}
}

public class Thing2Model() : Thing1Model
{
  public DateTime MyDate {get; set;}
}

并在您的View:// model2

@using(Html.BeginForm(....))
{
     @Html.PartialView("_myForm");
       @Html.TextBoxFor(m=>m.MyDate);
}

_myForm有一个Thing1Model模型,内容为:

 @Html.HiddenFor(m=>m.type);
 @Html.LabelForI(m=>m.Name);

但是什么时候会在View(thing1)中,只使用:

@using(Html.BeginForm(...))
{
 @Html.PartialView("_myForm");
}