c# - कैसे asp.net MVC दृश्य में एक मॉडल सेट करने के लिए सशर्त?




asp.net-mvc model asp.net-mvc-partialview (3)

मैं एएसपी.नेट एमवीसी में शुरुआत कर रहा हूं।
मेरे पृष्ठ में एक आंशिक दृश्य है जिसे _ Navigation कहा जाता है कि मैं पुनः उपयोग कर रहा हूं।
अगर उपयोगकर्ता "होम" में है, तो नेविगेशन के <a> "" को इंगित करने की आवश्यकता है, अगर उपयोगकर्ता "सेवा" पृष्ठ में है, नेविगेशन का href अन्य यूआरएल को इंगित करने की आवश्यकता है, चलो "www.mysite.com" कहें यह इस मेनू में अन्य लिंक के साथ भी होगा

मैंने निम्नलिखित करने की कोशिश की

@if (ViewContext.RouteData.Values.ContainsValue("Services"))
{
    @model MySite.Models.ServicesNavigation
}
else
{
    @model MySite.Models.HomeNavigation
}

लेकिन यह कहता है कि मेरे पास केवल एक ही मॉडल हो सकता है।
इसे कैसे हल करें?


Answers

आपका दृश्य वास्तव में WebViewPage<TModel> वर्ग से लिया गया वर्ग है @model कथन मॉडल के प्रकार को परिभाषित करता है ( TModel ) क्योंकि यह संकलित समय वक्तव्य है, आप इसे चलाने के समय में नहीं बदल सकते।

यदि आपको दो अलग-अलग मॉडलों की जरूरत है, तो आपको दो अलग-अलग दृश्य मिलना चाहिए।


आप Interface का उपयोग करने का प्रयास कर सकते हैं।

public interface INavigation
{
    //Your props here
}

public class ServicesNavigation : INavigation
{
}

public class HomeNavigation: INavigation
{
}

फिर आपका दृश्य प्रकार इनाइजिकेशन के हो सकता है

@model INavigation

और अपनी शर्तों के आधार पर आपके नियंत्रक में आप चाहते हैं कि INavigation के INavigation को पारित कर सकते हैं।

.......
INavigation model;
if(conditionOneIsMet)
{
    model = new ServicesNavigation();    
}
else
{
    model = new HomeNavigation();
}

return View(model);

यदि आप सभी फैंसी-पैंट जाना चाहते हैं, तो यहां यह करने में सक्षम होने के लिए आप इसका विस्तार कैसे कर सकते हैं:

@(Html.ActionLink<ArticlesController>(x => x.Details(), article.Title, new { id = article.ArticleID }))

आपको इसे System.Web.Mvc नेमस्पेस में रखना होगा:

public static class MyProjectExtensions
{
    public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> expression, string linkText)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink<TController, TAction>(this HtmlHelper htmlHelper, Expression<Action<TController, TAction>> expression, string linkText, object routeValues)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> expression, string linkText, object routeValues, object htmlAttributes) where TController : Controller
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var attributes = AnonymousObjectToKeyValue(htmlAttributes);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.MergeAttributes(attributes, true);
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    private static Dictionary<string, object> AnonymousObjectToKeyValue(object anonymousObject)
    {
        var dictionary = new Dictionary<string, object>();

        if (anonymousObject == null) return dictionary;

        foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject))
        {
            dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject));
        }

        return dictionary;
    }
}

इसमें Route Values और HTML Attributes लिए दो ओवरराइड शामिल हैं, आपके सभी विचारों को जोड़ने की आवश्यकता होगी: @using YourProject.Controllers या आप इसे अपने web.config <pages><namespaces> जोड़ सकते हैं।







c# asp.net-mvc model asp.net-mvc-partialview