背景
尝试在ASP.NET MVC中呈现局部视图时,我收到以下错误.我是ASP.NET MVC的新手,我确信错误很容易解决,这源于我缺乏完整的理解.
问题(对于那些不想阅读所有内容的人):
导致此错误的原因是什么?
异常详细信息::
System.InvalidOperationException传递到字典中的模型项是类型,'MyApp.Models.ClassroomFormViewModel'但此字典需要类型为'System.Collections.Generic.IEnumerable1 的模型项 [MyApp.Models.ClassroomFormViewModel]'.
的entites
我有两个父/子关系的实体.
Classroom StickyNote
------------ -----------
Id 1 ----- Id
Name \ Name
(...) \ Content
---- * ClassroomID
模型
在ModelStickyNote中,内容保存在不同的表中,并进行访问(使用Linq-to-SQL以下方法:
public IQueryable<StickyNote> GetStickyNotesByClassroom(Classroom classroom)
{
return from stickynote in db.StickyNotes
where stickynote.ClassroomID == classroom.ID
select stickynote;
}
Run Code Online (Sandbox Code Playgroud)
错误
我创建了一个显示StickyNote内容的部分视图,因为它"属于"它所在的教室.我遇到的问题是我无法显示它,并收到以下错误:
传递到字典中的模型项是类型:
'MyApp.Models.ClassroomFormViewModel'但是这个字典需要类型为'System.Collections.Generic.IEnumerable1 的模型项 [MyApp.Models.ClassroomFormViewModel]'.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.异常详细信息::
System.InvalidOperationException传递到字典中的模型项是类型,'MyApp.Models.ClassroomFormViewModel'但此字典需要类型为'System.Collections.Generic.IEnumerable1 的模型项 [MyApp.Models.ClassroomFormViewModel]'. …
我jQuery.load()用来渲染局部视图.这部分看起来像这样:
$('#sizeAddHolder').load(
'/MyController/MyAction', function () { ... });
Run Code Online (Sandbox Code Playgroud)
我的控制器中的操作代码如下:
public ActionResult MyAction(byte id)
{
var model = new MyModel
{
ObjectProp1 = "Some text"
};
return View(model);
}
[HttpPost]
public ActionResult MyAction(byte id, FormCollection form)
{
// TODO: DB insert logic goes here
var result = ...;
return Json(result);
}
Run Code Online (Sandbox Code Playgroud)
我返回的部分视图看起来像这样:
<% using (Html.BeginForm("MyAction", "MyController")) {%>
<%= Html.ValidationSummary(true) %>
<h3>Create my object</h3>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.ObjectProp1) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Size.ObjectProp1) …Run Code Online (Sandbox Code Playgroud) 我正在使用类似的东西更新部分视图的div:
<% using (Ajax.BeginForm("Action", "Controller",
new { id=Model.id },
new AjaxOptions
{
UpdateTargetId = "divId",
InsertionMode = InsertionMode.InsertAfter,
}))
{ %>
Run Code Online (Sandbox Code Playgroud)
并且它的工作正常,返回的视图被添加到div,但是我现在需要在帖子成功时执行javascript,所以我想:"简单,只需添加 OnSuccess = "MyJsFunc()"" AjaxOptions,但是在这之后,它停止了工作!现在页面被刷新,只返回部分视图:(,我甚至试过一个简单的Alert("Hi"),它也没有工作..我怎么能让这个工作?
(顺便说一句,我认为这可能是一个重复的/sf/ask/139632811/但是这个问题被废弃了回答)
我正在尝试使用json响应,其中某些值是由部分呈现的html
#projects_Controller.rb
def index
respond_to do |f|
f.json
end
end
# index.json.erb
{
"html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
ActionView::Template::Error (Missing partial projects/disclaimer with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>
[:json], :locale=>[:en, :en]} in view paths "c:/rails/app/views", "c:/rails/vendor/plugins/more/app/views", "C:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.1.8/app/views")
Run Code Online (Sandbox Code Playgroud)
似乎JSON请求在其名称中使用.json.erb呈现部分但不是.html.erb,这就是我所拥有的.有没有办法让我指定'html'.
ADDED:如果请求是'js',并且在index.js.erb中我渲染了几乎相同的代码:#index.js.erb
disclaimer = {
"html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
}
Run Code Online (Sandbox Code Playgroud)
它确实找到了projects/disclaimer.html.erb并正确呈现它.我想知道为什么会出现这样的不一致,如果有人请求js,其模板中的任何部分渲染都会查找partial_name.html.erb但是如果请求json,部分渲染会要求partial_name.json.erb?
谢谢
我有一个网站,在布局中定义了导航栏.导航栏用于站点的多个视图中,并具有一些动态内容,这些内容是从数据库中的几个查询生成的.
我想知道渲染这个菜单的最佳做法是什么(在局部视图中定义).
据我所知,我可以通过两种方式实现,每种方式都有一些优点和缺点:
使用Html.Action:+它完全独立于使用布局的视图 - 它添加了一个额外的请求来呈现页面的一部分 - 我添加了一个Action方法,它返回一个未从Ajax调用的Partial视图.
使用Html.Partial:+一个简单的请求来渲染整个视图 - 每个视图模型必须包含导航栏所需的信息
我非常感谢您对此的见解,因为我在我的网站上有几个这样的场景,我不确定哪一个是最好的.
谢谢!
我有一个显示一组输入的表单.我也有一个按钮,当点击时,我发出一个ajax请求,它应该用一组不同的输入替换现有的输入.
我所有的ajaxy链接东西都很好.问题是我正在使用a form_for,所以为了显示新的表单输入,我需要表单构建器实例.
<%= simple_form_for @order do |f| %>
<div id="info">
<%= render 'my_first_form_fields_partial', f: f %>
</div>
<%= link_to 'Change inputs', change_inputs_path, remote: true %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我希望我的js.erb看起来像这样,但f只在视图中的窗体范围内定义.
$('#info').html("<%= escape_javascript(render 'my_second_fields_partial', f: f) %>");
Run Code Online (Sandbox Code Playgroud)
我怎样才能使它能够f以某种方式进入那个部分呢?
ajax ruby-on-rails partial-views ruby-on-rails-3 simple-form
在我的ASP.NET MVC3项目中,我有一个_Layout.cshtml由Visual Studio 2010生成的标准,在关闭我的<body>标记后,我放置了一个RenderSection:
_Layout.cshtml:
</body>
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
@RenderSection("ScriptContent", required: false)
</html>
Run Code Online (Sandbox Code Playgroud)
然后在我的Index.cshtml视图中我有:
@model MyApp.ViewModels.MyViewModel
@{ Html.RenderPartial("MyPartial", Model); }
Run Code Online (Sandbox Code Playgroud)
如果我将它@section ScriptContent放在Index.cshtml中,它会正确显示.如果我将它放在我的部分视图中MyPartial.cshtml:
@model MyApp.ViewModels.MyViewModel
@section ScriptContent {
<script src="@Url.Content("~/Scripts/Filters.js")" type="text/javascript"></script>
}
Run Code Online (Sandbox Code Playgroud)
在我的页面来源中,我有:
</body>
<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
</html>
Run Code Online (Sandbox Code Playgroud)
意思@section是没有执行.可能是什么原因?谢谢
我正在使用具有类似内容的Razor MVC的主布局
@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)
并有部分观点
_partial.cshtml
有这个
@section scripts
{
@Scripts.Render("~/bundles/jquery")
}
Run Code Online (Sandbox Code Playgroud)
另一部分偏见
_partial_inside_partial.cshtml
那也有
@section scripts
{
<script>
$('div').addClass('red');
</script>
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码部分内部的问题,它在页面中间的负载,jquery是在底部?
有没有办法让页面的一部分呈现像一个小的子页面,如组件?
例如,如果我的所有页面上都有购物车?
我在局部视图中定义了一个部分,我想从视图中指定部分的内容.但我无法想办法.在asp.net用户控件中,我们可以定义asp:占位符,并指定用户控件所在的aspx中的内容.我会很高兴任何建议.
谢谢
[edit]这是asp.net用户控件,我想将其转换为razor局部视图
用户控制:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpryListView.ascx.cs" Inherits="SpryListView" %>
<div spry:region="<%=this.SpryDataSetName%>" id="region<%=this.ID%>" style="overflow:auto;<%=this.DivStyle%>" >
<table class="searchList" cellspacing="0" style="text-align:left" width="100%">
<thead>
<tr>
<asp:PlaceHolder ID="HeaderColumns" runat="server"></asp:PlaceHolder>
</tr>
</thead>
</table>
Run Code Online (Sandbox Code Playgroud)
用户控制代码:
public partial class SpryListView : System.Web.UI.UserControl
{
private string spryDataSetName ;
private string noDataMessage = "Arad???n?z kriterlere uygun kay?t bulunamad?.";
private bool callCreatePaging;
private string divStyle;
private ITemplate headers = null;
private ITemplate body = null;
[TemplateContainer(typeof(GenericContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate HeaderTemplate
{
get
{
return headers;
}
set
{
headers …Run Code Online (Sandbox Code Playgroud) partial-views ×10
asp.net-mvc ×8
razor ×3
c# ×2
.net ×1
ajax ×1
asp.net ×1
asp.net-ajax ×1
jquery ×1
json ×1
sections ×1
simple-form ×1
validation ×1
view ×1