我有一个控制器有两个动作:
[AcceptVerbs("GET")]
public ActionResult Add()
{
PrepareViewDataForAddAction();
return View();
}
[AcceptVerbs("POST")]
public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection)
{
if (ViewData.ModelState.IsValid)
{
GigManager.Save(gig);
return RedirectToAction("Index", gig.ID);
}
PrepareViewDataForAddAction();
return View(gig);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,当表单发布其数据时,Add操作使用GigBinder(IModelBinder的实现)
在这个活页夹我有:
if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour))
{
gig.StartDate.Hour = hour;
}
else
{
bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open");
}
Run Code Online (Sandbox Code Playgroud)
表单包含一个ID为"StartDate.Hour"的文本框.
如上所示,GigBinder测试用户是否在文本框中输入了一个整数,其中包含id"StartDate.Hour".如果没有,则使用AddModelError将模型错误添加到模型状态.
由于gigs属性gigs.StartDate.Hour是强类型的,因此如果用户在表单文本框中键入了这个值,我就无法将其值设置为"TEST".
因此,我无法设置gigs.StartDate.Hour的值,因为用户输入的是字符串而不是整数.
由于Add Action返回视图并传递模型(返回View(gig);)如果modelstate无效,当表单重新显示验证消息时,值"TEST"不会显示在文本框中.相反,它将是gig.StartDate.Hour的默认值.
我如何解决这个问题?我真的卡住了!
问题简而言之:
如何在MVC.NET中做到这一点?
长版问题:
我试图在SQL表中使用DateTime列进行版本跟踪(这本身就是一个解决方案,用于在通过表的editview传回后重新附加Linq2Sql数据类)
但现在我得到"没有找到或改变行" - 异常.在ctx.submit上:
ctx.appointments.Attach(appointment,true);
ctx.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
其中ctx是我的Linq datacontext,约会我的表,并预约我试图附加的约会对象..我已将约会表设置为sugested here
建议的解决方案的读者也注意到了这个问题.他认为这是一个解决方案.
这里的问题是我不使用webforms,我使用MVC.NET.所以我猜测正在使用
<%= Html.Hidden("LastUpdate", Model.LastUpdate) %>
Run Code Online (Sandbox Code Playgroud)
使LastUpdate属性更改.那么有什么方法可以确保在传回我的更新操作时获得相同(或至少相等)的DateTime对象?
我在更新约会表时使用建议的gettime()触发器.这显然存储了一个sql datetime对象.这可能不是由Linq2SQL精确解析的.我想这也增加了问题.
我希望有一个解决方案.我知道只使用时间戳格式也可以解决它..但这超出了这个问题的范围
我已经看到了几个类似的场景,但不是我特别的场景.我想知道是否有人可以告诉我进入哪个方向?
我正在开发两个(以及更晚的)MVC2应用程序.稍后还会有另一个(更厚的)客户端(WPF或Silverlight,TBD).这些都需要共享相同的身份验证.对于MVC2应用程序,他们(最好)需要单独登录 - 即如果用户登录到一个MVC2应用程序,只要cookie没有超时,就应该授权另一个MVC2应用程序.
将使用表单身份验证.
所有应用程序都需要使用通用业务功能,并通过通用WCF服务应用程序执行数据库访问.如果WCF不能公开访问(即在FW后面被阻止),那将是很好的(我认为).较厚的客户端可以使用附加服务层来访问Common WCF App.
这应该是什么样的:
MVCApp1 - > WCFAppCommon
MVCApp2 - > WCFAppCommon
ThickClient - > WCFApp2 - > WCFAppCommon
是否可以在WCFAppCommon中执行所有身份验证/授权?否则我想我将不得不重复MVCApps和WCFApp2中的所有安全逻辑,而对我来说,它似乎自然而然地存在于WCFAppCommon中.另一方面,似乎我在WCFAppCommon中进行身份验证/授权,我将无法使用表单身份验证.
我已经看到了可能的解决方案(我还没有尝试过),它们看起来比表单身份验证和单个数据库复杂得多.
任何帮助,赞赏,
菲尔
我知道在触发动作之前/之后会有事件发生.
在调用控制器之前,堆栈中是否有更高的值?
这很奇怪,我不知道为什么.我有一个ViewModel为我的对象返回一些值,在渲染它时,它们有不同的值,但是,它们指向同一个属性:
<%: Model.myProperty %>
Run Code Online (Sandbox Code Playgroud)
返回"25",这是我设置的属性.但是当它作为文本框呈现时,它返回"0"作为我的文本框的值!
<%: Html.TextBoxFor(f => f.myProperty) %>
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?该属性为十进制类型.谢谢.
我正在使用Razer语法玩MVC3,不过我认为问题更为笼统.
在控制器中,我有类似的东西:
ViewModel.User = New User(); // The model I want to display/edit
ViewModel.SomeOtherProperty = someOtherValue; // Hense why need dynamic
Return View();
Run Code Online (Sandbox Code Playgroud)
我的视图继承自System.Web.Mvc.ViewPage
但如果我尝试做类似的事情:
<p>
@Html.LabelFor(x => x.User.Name
@Html.EditorFor(x => x.User.Name
</p>
Run Code Online (Sandbox Code Playgroud)
我收到错误:"表达式树可能不包含动态操作"
但是,使用ViewPage似乎很常见,编辑器/ LabelFor也是如此.因此,如果没有办法做到这一点,我会感到惊讶 - 欣赏任何指针.
我正在开发ASP.NET应用程序,并遇到与重新提交行为有关的"问题".我正在使用表单提交事件中的计数器控制重新提交,如果已经发布,则禁用提交.我的应用程序是一个3步骤的工作流程,当显示第3步时,事务从第2步提交到第3步.我的问题是什么?嗯...我想避免用户通过按F5或所有其他可能性重新提交数据.我不想禁用密钥,因为可能是解决方法.我想知道我是否可以删除在渲染完成后运行的HTTP模块中的帖子数据,并且在响应发送给用户之前.
我正在制作一个网页(http://example.com/calculation/).该网站将进行简单的计算.该页面将以文本框(asp:TextBox)的形式向用户显示两个输入字段.我想知道如何处理点击"Calc"按钮(asp:按钮)?
因为我使用MVC模板,我是否将控制器用于页面?我该如何组织我的代码?
我想在两个文本框中获取用户输入,并在"结果"标签中输出值.
我有一个嵌套的转发器设置,但后面的代码中没有识别子转发器控件.它甚至没有添加到设计器文件中.我在aspx和ascx页面上尝试了这个但是两者都给出了同样的问题.
<asp:Repeater ID="RepeaterParent" runat="server">
<ItemTemplate>
<asp:Repeater ID="RepeaterChild" runat="server">
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Run Code Online (Sandbox Code Playgroud)
如果在页面上,后面的代码只识别RepeaterParent而不识别RepeaterChild.
有人可以帮我从这里出去吗?非常感谢!
asp.net-mvc ×7
asp.net ×3
c# ×1
controller ×1
datetime ×1
dynamic ×1
forms ×1
repeater ×1
repopulation ×1
sql ×1
versioning ×1
wcf ×1