ASP.NET MVC 2 Preview 1中的一个新功能是支持编辑器模板和显示模板的概念,它允许您使用简单的HTML帮助程序调用预定义如何呈现给定对象以进行显示或编辑:
<%=Html.EditorFor(customer => customer) %>
<%=Html.DisplayFor(customer => customer) %>
Run Code Online (Sandbox Code Playgroud)
这很酷,但我并没有真正看到它和部分视图之间的区别,它们用于相同的目的.此外,在示例中,我看到编辑器模板不包含实际的表单标签,并且如果我需要为给定的编辑器提供一些客户端功能(比如通过jQuery),我无法安全地将代码放入模板,因为我在窗体上没有静态句柄我在客户端添加逻辑.在我正在处理的应用程序中,我有一个编辑器模板和部分视图的混合物,我将其渲染以编辑内容.根据表单的复杂性,我创建了一个编辑器,因为我选择了一种方法而不是另一种方法,但这当然会给应用程序带来不希望的不一致程度.
为什么在部分视图上使用模板或反之亦然?此外,使用编辑模板时,将编辑器添加客户端逻辑而不将其复制到使用该编辑器的每个视图中的理想方法是什么?
所以我将"编辑"表单转换为ajaxForm,其中包含以下内容:
$('#reviewForm').ajaxForm({
success: function (response) {
$('#bookReview').html(response);
}
});
Run Code Online (Sandbox Code Playgroud)
这将返回相同的表单,必要时可以再次编辑.然而,第二个表单提交不再附加ajaxForm(),这是有道理的.
我如何确保此表单始终是ajaxForm,无论发生了多少次提交,类似于live()函数的工作方式?
我已经设置了一个局部视图,其中包含自己的表单标记,如下所示:
<tr>
@using (Html.BeginForm("Create"))
{
<td>
@Html.TextBoxFor(model => model.Date)
@Html.ValidationMessageFor(model => model.Date)
</td>
<td>
@Html.TextBoxFor(model => model.Amount)
@Html.ValidationMessageFor(model => model.Amount)
</td>
<td>
@Html.TextBoxFor(model => model.Tags)
@Html.ValidationMessageFor(model => model.Tags)
</td>
<td>
@Html.EnumDropDownListFor(model => model.Type)
</td>
<td>
<input type="submit" value="Add" />
@Html.ValidationSummary(true)
</td>
}
</tr>
Run Code Online (Sandbox Code Playgroud)
我使用@ Html.Action("Create")在页面上渲染它(它是表格的一部分,因此是<tr>标签.
由于一些奇怪的原因,我的客户端验证不起作用,我首先看到发布时的错误.
部分视图和客户端验证有什么特别之处吗?
我已经包含以下脚本:
<script src="/Scripts/jquery.1.5.1.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
编辑
我只是试着把这个脚本扔到页面上:
jQuery('form').submit(function ()
{
alert(jQuery(this).valid());
});
Run Code Online (Sandbox Code Playgroud)
它警告'true',因此客户端验证脚本肯定存在,并且由于某种原因它不检查有问题的字段: - /
编辑2
我已将页面的整个源代码(HTML + JS)上传到pastebin:http://pastebin.com/GvqLW495
我在Site.Master页面中定义了一个$(document).ready()事件,我还想在我的一个局部视图中定义另一个$(document).ready()(用于显示msgs和错误消息) ,我在所有页面和所有局部视图中调用此局部视图...
局部视图显示在页面中,也使用模态弹出窗口...所以我尝试了这个但是部分视图中的ready事件没有触发
我有几件事要问:
如果有些身体可以提供一些例子......
好的,我在应用程序控制器中有一个辅助方法:
def run_test(test_name)
#computation stuff
render :partial => test_name
end
Run Code Online (Sandbox Code Playgroud)
我在观点中称之为:
<%= run_test("testpartial") %>
Run Code Online (Sandbox Code Playgroud)
并且它只用1渲染(虽然......渲染部分似乎返回一个数组而不仅仅是部分内容?),但是如果我在视图中放入run_test辅助调用两次,我会得到一个双渲染错误,不应该发生偏袒.
有任何想法吗?
我有两个对象,我想并排渲染.从来没有我想要渲染更多或少于两个的情况.我的模型设置如下:
{
obj1: {...},
obj2: {...}
}
Run Code Online (Sandbox Code Playgroud)
使用小胡子模板,我想使用相同的部分渲染每个对象:
<div>
<h1>Object 1</h1>
{{>objPartial}}
</div>
<div>
<h1>Object 2</h1>
{{>objPartial}}
</div>
Run Code Online (Sandbox Code Playgroud)
但是,小胡子似乎不支持将上下文传递给partial.做类似的事情{{>objPartial obj1}}似乎应该得到支持,但我找不到任何关于为部分设置上下文的文档.
是否支持这种事情?如果没有,如何在不重复部分(objPartial1和objPartial2)的情况下实现相同的效果?
我有一个案例,复杂的局部视图需要根据部分视图的使用位置进行不同的字段验证.
我认为我可以通过使局部视图将接口作为模型类型并基于接口实现两个不同的ViewModel来解决这个问题.两个ViewModel中的数据注释会有所不同.然后,我将向部分视图提供正确的ViewModel的实例.
但我发现,唯一被识别的注释是界面本身的注释.实现ViewModel类的接口上的DA被忽略,即使这些是作为模型传递的对象.所以我的计划不起作用.
有没有解决的办法?更好的方法?如果可以避免,我宁愿不将局部视图拆分为单独的视图.
ETA:这是部分视图的缩写版本,如下所示:
@model IPerson
@Html.ValidationSummary(false)
<fieldset>
<table class="editForm">
<tr>
<td class="editor-label">
@Html.LabelFor(model => model.FirstName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</td>
<td class="editor-label">
@Html.LabelFor(model => model.LastName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</td>
</tr>
</table>
<fieldset>
Run Code Online (Sandbox Code Playgroud)
真正的局部视图很长,有很多@if语句管理可选部分的渲染(或不渲染),但它没有做任何棘手的事情.
我正在粗略地将ryanb的令人敬畏的nested_form gem集成到我的rails 3.1.3应用程序中.我担心我的Javascript技能太有限,无法知道它是我的代码(可能)还是需要更改的宝石.也许有人可以提供帮助.
设置:我有一个":household"类:accepts_nested_attributes_for":members(people)".我正在运行开发服务器.我将nested_form.js移动到/ app/assets/javascripts目录.我几乎肯定它只被采购一次.
问题:如果在家庭控制器"新"方法中,我这样做:
@household = Household.new
Run Code Online (Sandbox Code Playgroud)
我只看到视图中的家庭原生字段(预期),并且"link_to_remove"和"link_to_add"链接呈现/删除成员字段部分(预期).但是,如果我这样做:
@household = Household.new
@household.members.build
Run Code Online (Sandbox Code Playgroud)
我在视图中看到了家庭原生字段(预期),成员本地字段的一个呈现部分(预期),但"link_to_remove"和"link_to_add"什么都不做(意外).我无法添加另一个:成员部分在那一点,也不删除已经显示的:成员部分.
我很难过.下面是看似相关的精简源文件.我从git存储库获取了nested_form插件(最后捆绑了2012.04.18)...
/app/models/household.rb
class Household < ActiveRecord::Base
has_many :members, :class_name => "Person"
accepts_nested_attributes_for :members
attr_accessible :id, :name, :member_ids
attr_accessible :members_attributes
end #class
Run Code Online (Sandbox Code Playgroud)
/app/models/person.rb
class Person < ActiveRecord::Base
belongs_to :household
attr_accessible :id, :name_given, :name_middle, :name_family, :household_id
end #class
Run Code Online (Sandbox Code Playgroud)
/app/controllers/households_controller.rb
<snip>
# GET /households/new
# GET /households/new.json
def new
@household = Household.new
@household.members.build # <---- Removing this changes the behavior
respond_to do |format|
format.html # new.html.erb
format.json { …Run Code Online (Sandbox Code Playgroud) ruby-on-rails partial-views jquery-plugins nested-attributes ruby-on-rails-3.1
我通过:collection选项将一个集合(@feed_items)传递给_feed_item部分.在_feed_item部分内部,我想渲染另一个部分_like_button.在_like_button partial中,我希望能够访问集合的特定成员.我应该从_feed_item部分传递到_like_button部分?
@feed_items = current_user.user_feed.order("id DESC").limit(5)
Run Code Online (Sandbox Code Playgroud)
_feed.html.erb
<%= render partial: 'shared/feed_item', collection: @feed_items %>
Run Code Online (Sandbox Code Playgroud)
_feed_item.html.erb
<%= render 'likes/like_button', ????? %>
Run Code Online (Sandbox Code Playgroud)
_like_button.html.erb
<% if like = current_user.likes.find_by_feed_id(feed_item.id) %>
Run Code Online (Sandbox Code Playgroud)
编辑
根据以下答案传递局部变量:
<%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>
Run Code Online (Sandbox Code Playgroud)
但是,在提交之后,我正在ActionView::Template::Error (undefined local variable or method 'feed_item'尝试通过ajax再次呈现表单.如何通过ajax调用再次传递局部变量?
调节器
class LikesController < ApplicationController
def create
@like = Like.create(params[:like])
@feed = @like.feed
render :toggle
end
def destroy
like = Like.find(params[:id]).destroy
@feed = …Run Code Online (Sandbox Code Playgroud) 我创建了一个haml-partial,我想将其用作默认标头.渲染出来时,我可以选择给它一个块来替换默认内容的一部分.
我尝试过多种方法:
render partial: "partial", capture: do
# Don't really know why I tried this, Syntax error ofcourse.
render partial: "partial" do
# 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.
render layout: "partial" do
# Works, but:
render layout: "partial"
# You invoked render but did not give any of :partial, :template, :inline, :file or :text option.
# So, it always needs the block
Run Code Online (Sandbox Code Playgroud)
还有其他我不知道的选择吗?
partial-views ×10
asp.net-mvc ×2
javascript ×2
jquery ×2
domready ×1
dry ×1
forms ×1
haml ×1
interface ×1
mustache ×1
rendering ×1
ruby ×1