Dynamic typed ViewPage

后端 未结 4 1111
无人及你
无人及你 2020-12-30 07:14

Is this possible? Here\'s what I\'m trying:

    public ActionResult Index()
    {
        dynamic p = new { Name = \"Test\", Phone = \"111-2222\" };
                


        
4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-30 07:44

    What benefit were you hoping to get from using the dynamic type here?

    Using the ViewData dictionary is a very easy way of adding arbitrary objects/items to your view output.

    You don't need reflection to get the property names within your View. Just use ViewData.Keys to get the collection of names.

    Edit: I've just learned a bit more about dynamics myself and I think maybe you need to create your own dynamic object class that inherits from DynamicObject. You'll want to have a private dictionary in that class and then override TrySetMember and TryGetMember.

    Edit Aside: I think one advantage of a strongly typed ViewModel is that you can accept it as a parameter in your POST Action methods. The MVC framework will handle the model binding and in the action method you simply have an instance of your ViewModel class. I don't think you'll have that advantage with a dynamic even if they do work.

    Edit Result: Well, I tried using a class derived from DynamicObject, but VS2010 crashes when it tries to render the view. I don't get any exception, just a hard crash and Visual Studio restarts. Here's the code I came up with that causes the crash.

    The custom dynamic class:

    public class DynViewModel : DynamicObject
    {
        private Dictionary ViewDataBag;
        public DynViewModel()
        {
            this.ViewDataBag = new Dictionary();
        }
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            this.ViewDataBag[binder.Name] = value;
            return true;
        }
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = this.ViewDataBag[binder.Name];
            return true;
        }
    }
    

    In the controller:

    public ActionResult DynamicView()
    {
        dynamic p = new DynamicViewModel.Models.DynViewModel();
        p.Name = "Test";
        p.Phone = "111-2222";
    
        return View(p);
    }
    

    My view is basically the same as what is listed in the question:

    Name: <%=Model.Name %>

    Phone: <%=Model.Phone %>

    My Conclusion: This might work, but in the Beta 1 of VS2010 I can't figure out why my code causes Visual Studio to crash. I'll try it again in VS2010 Beta 2 when it is released because it is an interesting exercise in learning about dynamics. However, even if this were to work, I still don't see any advantage over using the ViewData dictionary.

    Phil Haack to the rescue! Here's a blog post by Phil Haack that might help you out. It looks like it is what you were looking for. Fun With Method Missing and C# 4

提交回复
热议问题