我正在尝试渲染一个视图,该视图仅包含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;
}
}
答案 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>