当我渲染局部视图时,我的模型是空的

时间:2018-01-10 11:34:38

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

我正在尝试渲染一个视图,该视图仅包含ASP.NET MVC中另一个View内的DropDownList,但出于某种原因,Model是Null。我认为这是因为我只是在调用视图而控制器根本就没有被调用。我哪里错了?也许我的手机方法不正确。

Dropbox View

@model MyWatch.Models.Countries
@{ 
    ViewBag.Title = "CountrySearch";
    Layout = null;
    if (Model != null)
    {
        Html.DropDownListFor(m => m.countries, new SelectList(Model.countries.Select(s => new SelectListItem { Text = s.name, Value = s.code })));
    }
    else
    {
        Html.DropDownListFor(m => m.countries, new SelectList(new List<String>()));
    }
}

主视图

<div class="form-group">
    @Html.LabelFor(m => m.Country, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @{Html.RenderPartial("Search/CountrySearch");}
    </div>
</div>

控制器

    public ActionResult CountrySearch()
    {
        try
        {
            using (StreamReader streamReader = new StreamReader("C:\\Users\\Alex Combe\\Documents\\Visual Studio 2015\\Projects\\MyWatch\\MyWatch\\App_Data\\CountryList.json"))
            {
                string json = streamReader.ReadToEnd();
                Countries countries = new Countries();
                countries.countries = JsonConvert.DeserializeObject<IList<Country>>(json);
                return View(countries);
            }
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine(e.StackTrace);
            return View(new Countries());
        }
    }
}

模型

namespace MyWatch.Models
{
    public class Country
    {
        public string name { get; set; }
        public string code { get; set; }
        public SelectList selectList { get; set; }
    }

    public class Countries
    {
        public IList<Country> countries;
    }
}

2 个答案:

答案 0 :(得分:1)

您正试图直接渲染视图,您应首先调用控制器操作。请改用Html.RenderAction;

<div class="col-md-10">
    @{Html.RenderAction("CountrySearch","Search");}
</div>

并返回PartialView而不是View;

return PartialView(countries);

此外,DropDownListFor第一个参数应该是选中的项目。

Html.DropDownListFor(m => m.SelectedItem, new SelectList(Model.countries.Select(s => new SelectListItem { Text = s.name, Value = s.code })));

也改变你的模型;

public class Countries
{
    public string SelectedItem { get; set; }
    public IList<Country> countries;
}

请确保CountryList.json包含您模型的有效数据。

答案 1 :(得分:-1)

@Html.Partial@Html.RenderPartial方法并不意味着调用Controller的Action方法,而是这些方法将直接从给定模型填充Partial View的标记并进行渲染。如果没有传递模型,那么它将只渲染视图标记,就好像模型是空的一样。

如果要使用RenderPartial,则需要在方法中直接传递模型对象,作为第二个参数 - 请参阅https://msdn.microsoft.com/en-us/library/system.web.mvc.html.renderpartialextensions.renderpartial(v=vs.118).aspx#M:System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial%28System.Web.Mvc.HtmlHelper,System.String,System.Object%29上的文档

e.g。 @Html.RenderPartial("Search/CountrySearch", yourModelObject)

如果您想通过控制器操作执行此操作,则必须改为调用@Html.RenderAction("CountrySearch", "Search"),并使CountrySearch方法以return PartialView而不是return View结束。< / p>