0

我想ActionResult根据用户的选择创建类似 's 的结构。

我的问题是它是否可以以更通用的方式完成,或者至少以某种方式即兴创作?

我只是为了确保它做得很好。

这是我的代码。

<p>A Partial Control that is initialized on Server-Side</p>
@{
    <h2>@ViewBag.InitializeUserControl</h2>
    Html.RenderAction("ShowGadget",new { actionName = (string)@ViewBag.InitializeUserControl } );      
}

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            @ViewBag.InitializeUserControl = "InitializeUserControl2"; // IT GOES FROM A DATABASE
            return View(new HomeModel());
        }

        public ActionResult ShowGadget(string actionName)
        {
            var gadgetPresenter = new GadgetPresenter();
            return gadgetPresenter.GetActionResult(actionName);
        }
    }


    public class GadgetPresenter : Controller
    {
        public ActionResult GetActionResult(string actionName)
        {
            if (string.IsNullOrEmpty(actionName))
            {
                return DefaultUserControl();
            }
            else
            {
                if (actionName.Equals("InitializeUserControl"))
                {
                    return InitializeUserControl();
                }
                else if (actionName.Equals("InitializeUserControl2"))
                {
                    return InitializeUserControl2();
                }
                else
                    return DefaultUserControl();
            }
        }

        public ActionResult InitializeUserControl2()
        {
            ColorModel colorModel = new ColorModel
            {
                Width = 100,
                Height = 100,
                RGBColor = "#FF0000"
            };

            return PartialView("UserControls/ColorBlockUserControl2", colorModel);
        }

        public ActionResult InitializeUserControl()
        {
            ColorModel colorModel = new ColorModel
            {
                Width = 200,
                Height = 200,
                RGBColor = "#FF0000"
            };

            return PartialView("UserControls/ColorBlockUserControl", colorModel);
        }

        public ActionResult DefaultUserControl()
        {
            return PartialView("UserControls/DummyControl");
        }

    }
4

1 回答 1

1

我想我理解你的意图,但我认为你可能会强制输入错误的模式。因此,鉴于这将是您数据库中的一个值,您需要确保以下几点:

  1. 如果相关项目存在或不存在,您的应用程序会优雅地失败。
  2. 您使用约定优于配置来帮助可维护性。

我认为您需要的模式/技术是移动视图引擎。以 Scott Hanselman 的MVC3移动视图引擎示例(来源)为例。请注意引擎如何查找 .mobile.cshtml 视图,如果不存在则回退到普通的 .cshtml 视图。显然,这现在已内置到 MVC4 中,但该技术对于各种目的都是可行的。

您可以根据自己的需要调整它,为您存储的与客户相关的数据库值查找会话变量或类似变量(Singleton over Session 将是我的方法),以获取视图前缀并专门为其提供不同的视图前缀。

回退是优雅的,模式都是关于约定和注入的。这当然是我解决您的问题的方法。我希望这对您有所帮助,无论您最终是否使用该技术。祝你好运,祝你好运!

于 2013-08-08T17:17:51.900 回答