Asp.net mvc 2 '+';MVC2中数据绑定时消失

Asp.net mvc 2 '+';MVC2中数据绑定时消失,asp.net-mvc-2,data-binding,Asp.net Mvc 2,Data Binding,当我试着发这封邮件时:“姓名+1@domain.com“我得到”这个名字1@domain.com“在控制器的模型属性中。有人知道我能做什么,这样“+”就不会消失吗 谢谢 编辑: 好吧,我想我没有给出足够的解释: 我有一个表单,允许我的用户通过不同的属性搜索成员,其中之一是电子邮件。在当前系统中,我有一些成员,电子邮件在字符串中使用“+”。(如:姓名+1@domain.com)当我尝试使用该用户的电子邮件搜索该用户时,发布到我的控制器的值不包含“+”,因此结果为“name”1@domain.com

当我试着发这封邮件时:“姓名+1@domain.com“我得到”这个名字1@domain.com“在控制器的模型属性中。有人知道我能做什么,这样“+”就不会消失吗

谢谢

编辑:

好吧,我想我没有给出足够的解释:

我有一个表单,允许我的用户通过不同的属性搜索成员,其中之一是电子邮件。在当前系统中,我有一些成员,电子邮件在字符串中使用“+”。(如:姓名+1@domain.com)当我尝试使用该用户的电子邮件搜索该用户时,发布到我的控制器的值不包含“+”,因此结果为“name”1@domain.com'搜索不会返回任何内容

我很确定这与编码有关,但我没有在这里使用任何链接,我发布了一个完整的SearModel witch,其中包含一个名为“Email”的字符串属性,它会自动绑定到我视图中同名的文本框

可以指定对模型对象的属性进行编码吗

再次感谢

这是我的模型:

public class SearchMemberModel
{
    [LocalizedDisplayName("MemberNumber")]
    public string MemberNumber { get; set; }

    [LocalizedDisplayName("Email")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [LocalizedDisplayName("FirstName")]
    public string FirstName { get; set; }

    [LocalizedDisplayName("LastName")]
    public string LastName { get; set; }

    [LocalizedDisplayName("Phone")]
    public string Phone { get; set; }

    [LocalizedDisplayName("ActiveOnly")]
    public bool Active { get; set; }
}
以及我的控制器的动作:

public virtual ActionResult ListAjax(SearchMemberModel search)
    {
        var gridModel = new GridModel<SerializableMember>();
        var data = _session.All<Member>();
        if (search != null)
        {
            if (search.Active) data = data.Where(x => x.Active);
            if (!string.IsNullOrEmpty(search.Email)) data = data.Where(x => x.Email.Contains(search.Email));
            if (!string.IsNullOrEmpty(search.FirstName)) data = data.Where(x => x.FirstName.Contains(search.FirstName));
            if (!string.IsNullOrEmpty(search.LastName)) data = data.Where(x => x.LastName.Contains(search.LastName));
            if (!string.IsNullOrEmpty(search.MemberNumber)) data = data.Where(x => x.MemberNumber.Contains(search.MemberNumber));
            if (!string.IsNullOrEmpty(search.Phone)) data = data.Where(x => x.Phone.Contains(search.Phone));
        }

        var list = new List<SerializableMember>(data.Count());
        list.AddRange(data.ToList().Select(obj => new SerializableMember(obj)));
        gridModel.Data = list;
        return View(gridModel);
    }
公共虚拟操作结果列表Ajax(SearchMemberModel搜索) { var gridModel=新的gridModel(); var data=_session.All(); 如果(搜索!=null) { if(search.Active)data=data.Where(x=>x.Active); 如果(!string.IsNullOrEmpty(search.Email))data=data.Where(x=>x.Email.Contains(search.Email)); 如果(!string.IsNullOrEmpty(search.FirstName))data=data.Where(x=>x.FirstName.Contains(search.FirstName)); 如果(!string.IsNullOrEmpty(search.LastName))data=data.Where(x=>x.LastName.Contains(search.LastName)); 如果(!string.IsNullOrEmpty(search.MemberNumber))data=data.Where(x=>x.MemberNumber.Contains(search.MemberNumber)); 如果(!string.IsNullOrEmpty(search.Phone))data=data.Where(x=>x.Phone.Contains(search.Phone)); } var list=新列表(data.Count()); list.AddRange(data.ToList().Select(obj=>newserializablember(obj)); gridModel.Data=list; 返回视图(gridModel); } 以及观点(教授这不是必要的):



型号.会员人数)%>
型号.会员人数)%>
型号.会员人数)%>
型号(电子邮件)%>
型号(电子邮件)%>
型号(电子邮件)%>
model.FirstName)%%>
model.FirstName)%%>
model.FirstName)%%>
model.LastName)%%>
model.LastName)%%>
model.LastName)%%>
型号(电话)%>
型号(电话)%>
型号(电话)%>
型号(活动)%>
型号(活动)%>
型号(活动)%>

{ colums.Bound(c=>c.Email).Title(Resources.Email).ClientTemplate(“”); colums.Bound(c=>c.FirstName).Title(Resources.FirstName); colums.Bound(c=>c.LastName).Title(Resources.LastName); columns.Bound(c=>c.MemberNumber).Title(Resources.MemberNumber); colums.Bound(c=>c.Phone).Title(Resources.Phone); colums.Bound(c=>c.Active).Title(Resources.Active).HeaderHtmlAttributes(new{@class=“center text”}).HtmlAttributes(new{@class=“center text”}).ClientTemplate(.png\”alt=\“\”/>); colums.Bound(c=>c.Id).Title(“”).HtmlAttributes(新的{@class=“center text”}).ClientTemplate(“”); colums.Bound(c=>c.Id).Title(“”).HtmlAttributes(新的{@class=“center text”}).ClientTemplate(“”); colums.Bound(c=>c.Id).Title(“”).HtmlAttributes(新的{@class=“center text”}).ClientTemplate(“”); }) .DataBinding(d=>d.Ajax().Select(MVC.Member.ListAjax(Model.GetRouteValueDictionary())) .Sortable() .NoRecordsTemplate(参考资料.NoData) %> $(文档).ready(函数(){ $('#btnSearch')。单击(函数(){ var grid=$('#grid')。数据('tGrid'); var搜索模型={ MemberNumber:$('#MemberNumber').val(), 电子邮件:$('#Email').val(), FirstName:$('#FirstName').val(), LastName:$('#LastName').val(), 电话:$(“#电话”).val(), 活动:$(“#活动”)。是(“:选中”) }; 网格重新绑定(searchModel); 返回false; }); }); g、 默认路径(“~/Content/Javascript/2010.3.1110”))%>

是的,您需要对其进行url编码:
名称%2B1%40domain.com
+
在url中表示空白。请注意,您还需要将
@
url编码到
%40
,因为它也有特殊含义

结论:始终使用url编码url。始终使用url帮助程序生成url。永远不要硬编码url


更新:

尝试:


是的,您需要对其进行url编码:
name%2B1%40domain.com
+
在url中表示空白。另外请注意,您需要将
@
url编码到
%40
,因为它也有特殊含义

结论:始终使用url编码url。始终使用url帮助程序生成url。永远不要硬编码url


更新:

尝试:


我想这可能是浏览器把它吃掉了。检查代码的实际输出,而不是查看浏览器状态栏

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Admin.Master" Inherits="System.Web.Mvc.ViewPage<Enquete.Models.SearchMemberModel>" %>
<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend><%: Resources.Search %></legend>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.MemberNumber) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.MemberNumber) %>
            <%: Html.ValidationMessageFor(model => model.MemberNumber) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Email) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Email) %>
            <%: Html.ValidationMessageFor(model => model.Email) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.FirstName) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.FirstName) %>
            <%: Html.ValidationMessageFor(model => model.FirstName) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.LastName) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.LastName) %>
            <%: Html.ValidationMessageFor(model => model.LastName) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Phone) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Phone) %>
            <%: Html.ValidationMessageFor(model => model.Phone) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Active) %>
        </div>
        <div class="editor-field">
            <%: Html.CheckBoxFor(model => model.Active) %>
            <%: Html.ValidationMessageFor(model => model.Active) %>
        </div>

        <p>
            <input type="submit" value="<%: Resources.ToSearch %>" id="btnSearch" />
        </p>
    </fieldset>

<% } %>

 <%= Html.Telerik().Grid<SerializableMember>()
                .Name("Grid")
                .Columns(colums =>
                 {
                     colums.Bound(c => c.Email).Title(Resources.Email).ClientTemplate("<a href=\"" + Url.Action(MVC.Member.Edit()) + "/<#=Id#>\" ><#=Email#></a>");
                     colums.Bound(c => c.FirstName).Title(Resources.FirstName);
                     colums.Bound(c => c.LastName).Title(Resources.LastName);
                     colums.Bound(c => c.MemberNumber).Title(Resources.MemberNumber);
                     colums.Bound(c => c.Phone).Title(Resources.Phone);
                     colums.Bound(c => c.Active).Title(Resources.Active).HeaderHtmlAttributes(new { @class = "center-text" }).HtmlAttributes(new { @class = "center-text" }).ClientTemplate("<img src=\"Content/images/icons/<#=Active#>.png\" alt=\"<#=Active#>\" />");
                     colums.Bound(c => c.Id).Title(" ").HtmlAttributes(new { @class = "center-text" }).ClientTemplate("<a href=\"" + Url.Action(MVC.Member.ResetPassword()) + "/<#=Id#>\" title=\"" + Resources.ResetPassword + "\" >" + Resources.ResetPassword + "</a>");
                     colums.Bound(c => c.Id).Title(" ").HtmlAttributes(new { @class = "center-text" }).ClientTemplate("<a href=\"" + Url.Action(MVC.Member.Activate()) + "/<#=Id#>\" title=\"" + Resources.Activate + "\" >" + Resources.Activate + "</a>");
                     colums.Bound(c => c.Id).Title(" ").HtmlAttributes(new { @class = "center-text" }).ClientTemplate("<a href=\"" + Url.Action(MVC.Member.Deactivate()) + "/<#=Id#>\" title=\"" + Resources.Deactivate + "\" >" + Resources.Deactivate + "</a>");
                 })
                .DataBinding(d => d.Ajax().Select(MVC.Member.ListAjax(Model).GetRouteValueDictionary()))
                .Sortable()
                .NoRecordsTemplate(Resources.NoData)
        %>
        <%= Html.AntiForgeryToken() %>

        <script type="text/javascript">
            $(document).ready(function () {
                $('#btnSearch').click(function () {
                    var grid = $('#Grid').data('tGrid');
                    var searchModel = {
                        MemberNumber: $('#MemberNumber').val(),
                        Email: $('#Email').val(),
                        FirstName: $('#FirstName').val(),
                        LastName: $('#LastName').val(),
                        Phone: $('#Phone').val(),
                        Active: $('#Active').is(':checked')
                    };
                    grid.rebind(searchModel);
                    return false;
                });
            });
        </script>

        <%= Html.Telerik().ScriptRegistrar().jQuery(false).DefaultGroup(g => g.DefaultPath("~/Content/Javascript/2010.3.1110"))%>
var searchModel = {
    MemberNumber: encodeURIComponent($('#MemberNumber').val()),
    Email: encodeURIComponent($('#Email').val()),
    FirstName: encodeURIComponent($('#FirstName').val()),
    LastName: encodeURIComponent($('#LastName').val()),
    Phone: encodeURIComponent($('#Phone').val()),
    Active: $('#Active').is(':checked')
};