我仍然大多不熟悉控制反转(虽然我现在正在学习它)所以如果这是我的问题的解决方案,请告诉我,我会回过头来学习它.
我有一对控制器需要一个Session变量,自然没有什么特别的事情发生,因为Session首先工作,但这让我想知道在两个独立的控制器之间共享相关对象最干净的方法是什么.在我的特定场景中,我有一个UploadController和一个ProductController,它们相互配合使用来上传图像文件.当UploadController上传文件时,有关上传的数据存储在Session中.发生这种情况后,我需要在ProductController中访问该Session数据.如果我在两个控制器中为包含我的上传信息的Session变量创建一个get/set属性,我将能够访问该数据,但同时我将违反各种DRY,更不用说创建一个,充其量,令人困惑的设计,其中一个对象由两个完全断开连接的对象共享和修改.
你有什么建议?
确切的背景:
文件上载View将文件发布到UploadController.ImageWithpreview(),然后读取已发布的文件并将其复制到临时目录.保存文件后,另一个类生成上传图像的缩略图.然后,使用JsonResult将原始文件和生成的缩略图的路径返回到javascript回调,该回调更新页面上可以"已保存"或"已取消"的表单中的某些动态内容.无论上传的图像是保存还是被跳过,我都需要从临时目录中移动或删除它和生成的缩略图.为此,UploadController在Session维护的Queue对象中跟踪所有上传文件及其缩略图.
返回视图:在使用生成的图像缩略图填充表单后,表单将回发到ProductsController,其中标识了所选文件(目前我将文件名存储在隐藏字段中,我意识到这是一个可怕的漏洞),然后从临时目录复制到永久位置.理想情况下,我想简单地访问我存储在Session中的队列,这样表单就不需要像现在一样包含图像位置.这就是我设想我的解决方案的方式,但我会热切地倾听任何评论或批评.
在实现存储库模式的ASP.NET MVC应用程序中,我很好奇是否适合将非数据相关方法放在存储库中,如果它们仍然属于给定存储库的一般焦点.例如,假设一个ProductsRepository具有添加和删除ProductImages的方法,这些方法在数据库和本地文件存储中也有部分表示.如果需要删除ProductImage,我们需要使用存储库方法从数据库中删除一行,并且还需要从存储介质中删除与该映像关联的文件.IO操作是否属于存储库,还是有更合适的位置?
我在我刚刚描述的情况下做的一件事就是在我的存储库中提供静态方法,它通过使用存储在数据库中的文件名和预定义的目录模式为我提供给定ProductImage的路径,以编程方式生成它.这是否超出了存储库的预期用途?
编辑
如果这样的操作不属于存储库,那么类似的东西应该放在MVC模式中?在我看来,在Controller和Repository之间有另一层可以根据需要调用Repository并且可以从Controller静态调用它.
我已经使用ASP.NET MVC几个月了,我对项目解决方案的布局仍然不满意.我正在尝试构建一个尽可能便携且可重用的中型网站CMS,并且在设计中存在一些明显的问题.我正在寻找一些关于如何构建我的解决方案的建议,考虑到关注点的分离.我在这里找到了一个类似的问题,但它并没有真正针对我面临的一些问题.
现在,这就是我的解决方案的布局:
+Project.Controllers - All Controller classes P+roject.Controllers.Tests +Project.Core - Utility classes including repetitive tasks and some configuration handlers (this project needs to be better fleshed out) +Project.Core.Tests +Project.Models - Model classes, Entity Framework context, and Repository classes +Project.Models.Tests +Project.Web - All Views and Content
我目前缺少的一个主要问题是坚持我的业务逻辑,我觉得我错误地将业务逻辑放在我的存储库类中,并将其混合在控制器操作中.显然,我非常清楚这个问题,我只是不确定将业务逻辑放在解决方案布局中的哪个位置.我的解决方案结构是否需要更改,还是可以在我的模型项目中安全地保留该业务逻辑?另外,我真的不喜欢我的EF上下文在Models类中,但我不知道如何将数据层代码与模型中所需的实体类隔离开来.
其他人如何布置他们的ASP.NET MVC生产解决方案?
到目前为止,我主要将标签和输入放在专用的段落标签中:
<p>
<label for="myInput">Blah</label>
<input type="text" ... />
</p>
Run Code Online (Sandbox Code Playgroud)
但是这个标签是为文本段落制作的.在语义上是否正确使用它?应该使用div吗?
我正在尝试优化我们网站上的SEO可读性,我遇到的一个问题是ASP.NET屠杀我的MasterPage的标题元素.在我的MasterPage中输入(手动重新格式化以删除由<% %>标记引起的换行符):
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /> - <%=WebsiteSettings.WebsiteName %></title>
Run Code Online (Sandbox Code Playgroud)
这是我收到的输出:
<title>
Home
- Website Name</title>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,ASP.NET正在添加<asp:ContentPlaceHolder />前导和尾随换行符,因为Visual Studio自动格式化<asp:Content />以开始和结束换行符.显然,在Visual Studio格式化选项中可以防止这种情况,但这并不理想,因为我只想删除TitleContent占位符而不是其余的行为.
有什么方法可以确保我的标题在渲染之前被修剪掉了吗?我正在使用MVC,因此代码隐藏不是一个可接受的选择.
对不起,我知道这个话题已经涉及了一些.我已阅读相关帖子,我仍然有点困惑.我正在开发一个应用程序,虽然原型将有3个主屏幕,但最终将有数十个.每个屏幕都将呈现动态变化状态或用户输入.为了可视化,需要布局类似于MS Word或典型PC的方式.它的顶部有一个状态栏,底部有一个导航栏,对于所有屏幕都是通用的(对于某些屏幕略有调整,比如不同的图标),我称之为需要更新的视图窗格.适用的布局.
状态,导航栏和每个屏幕都在其自己的布局xml文件中定义.对于我第一次嘲笑它,我只使用了ViewFlipper并将3个屏幕布局加载到其中.但是,这意味着目前我有一个主要的Activity,因为我继续添加屏幕,所以无法维护.
我知道这是一篇很长的帖子.我很感激任何建议.谢谢!CB
我的应用程序中有一对视图,它们都为我的一个模型项显示相同的编辑器模板; 在两个视图("添加"和"编辑")中,"编辑"工作正常,但当我的控制器操作处理帖子时,"添加"为模型返回null.
我发现如果我给"添加"视图一个自定义的ViewModel并调用Html.EditorFor(p => p.PageContent)而不是简单地在整个Model对象上调用EditorFor()Html.EditorFor(p => p),那么表单将返回正确的非null模型,但是会产生与之相关的其他问题.我的客户端脚本和控件ID(现在所有字段都以"PageContent_"为前缀).我在整个应用程序中的几个不同的地方使用相同的编辑器模板技术,其他人都没有表现出对ViewModel的奇怪依赖.
有没有其他人遇到类似的问题?
编辑视图
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", Model.Page.ID) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% }
Run Code Online (Sandbox Code Playgroud)
行动(工作)
[HttpPost, ValidateInput(false)]
public ActionResult EditContent(int id, FormCollection formCollection) {}
Run Code Online (Sandbox Code Playgroud)
添加视图
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", ViewData["PageID"]) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" …Run Code Online (Sandbox Code Playgroud) 所以我正在学习一些php,发现我的html技能有点生疏了.我正试图让我的textarea跨越两个表列.W3schools说我可以为<th>标签做一个colspan 但是没有看到它是否被支持<td>.我想把它分成两个表格相同的表格.似乎有一种更简单的方法可以做到这一点.我确实尝试过td colspan"2",但它没有做任何事情
echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" id="crud_form">';
echo '<table id="table_articles">';
echo '<tr><td>Article Title:</td><td> <input type="text" name="art_title" /></td></tr>';
echo '<tr><td>Author:</td><td> <input type="text" name="author" /></td></tr>';
echo '<tr><td>Date Posted:</td><td> <input type="text" name="d_posted" /></td></tr>';
echo '<tr><td>Article Text:</td></tr>';
echo '<tr><td><textarea rows="10" columns="60" name="art_text" ></textarea></td></tr>';
echo '<tr><td><input type="submit" name="submit_art" value="Submit" /></td></tr>';
echo '</table>';
echo '</form>';
Run Code Online (Sandbox Code Playgroud)
CSS
#crud_form
{
color:red;
position:absolute;
left:300px;
top:200px;
border-style:outset;
border-width:5px;
border-color:red;
background-color:#cccccc;
}
#table_articles
{
color:red;
width:450px;
height:300px;
}
Run Code Online (Sandbox Code Playgroud)
思考?谢谢您的帮助.
给定以下代码,我会期望一个空结果或异常:
String.Format(null, "Hello")
Run Code Online (Sandbox Code Playgroud)
相反,结果是字符串"Hello".为什么是这样?
我有一个正则表达式,用于匹配特定语法n次,每次出现后都有一个管道(|),最后一次出现除外.目前,我的模式是沿着的(pattern)\|{3},但这不满足没有尾随管道的要求.无论如何我可以不重复地 完成这个任务(pattern)吗?我能想到的最好的解决方案是(pattern)\|{2}(pattern).
有效示例:
*| 401 | [2-10]
无效的示例:
*| 401 | [2-10] |
(pattern)对于回答我的具体问题,其价值是无关紧要的,但为了完整性,这里它的形式是:(?:(?:((\*)|(\[[\w+ ]\-[\w+ ]\])|(\d+)))\|){3}
编辑
这是在.NET和JavaScript中使用的.
asp.net-mvc ×4
html ×3
.net ×1
android ×1
asp.net ×1
c# ×1
formatting ×1
javascript ×1
regex ×1
string ×1
title ×1
viewmodel ×1