我知道这看起来非常基本,而且应该是,但是我无法找出我出错的地方.(我已经在SO上阅读了其他类似标题的文章,以及网络上的其他资源,但仍然无法弄清楚),所以任何帮助都将受到赞赏.
我有一个控制器,在其中我设置一个字符串变量.现在我不介意它是采用属性,ActionResult还是直接方法的形式.我只想要一个简单的字符串,我可以在控制器中玩,并将其返回到视图.
基本上我要做的是列出给定文件夹中的文件.所以我的逻辑是这样的:
将路径附加到要查找的文件所在的位置.即如果我当前的文件夹是Web \,那么如果我想列出所有CSS文件,我会附加类似"Content\CSS"的内容.(我这样做是因为我想允许用户通过选择要应用的CSS来动态更改网站).所以它看起来像:
CurrentPath + ="Content\CSS"
我想将文件名加载到数组或列表中
重要的是要知道我正在尝试查看_Layout.cshtml上的字符串,因为我无法为它构建另一个视图.(除非我错了,在这种情况下我会提供任何帮助).
目前我仍在努力将一个简单的字符串传递给我的视图,我可以像在第2步中那样自由地操作它.
我从一个单独的静态类和一个全局变量开始:
public static class MyTheme
{
public static string CurrentPath = HostingEnvironment.MapPath("~");
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我有:@ Html.Label(MyProject.Web.Controllers.MyTheme.CurrentPath);
这工作但当我尝试使用if语句来确定字符串是否为空或我是否有错误.所以我的下一次尝试都失败了.
接下来我决定将它带入一个控制器(在本例中是我的BaseController),这是我开始遇到问题的时候.代码如下:
在BaseController类中
public ActionResult ThemePath()
{
string currentPath = Server.MapPath("~");
if (string.IsNullOrEmpty(currentPath))
{
currentPath = "Error!";
}
else
{
currentPath = "Our Path Is: " + currentPath;
}
return View(currentPath);
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何从我的_Layout.cshtml视图中访问和运行它
接下来我在BaseController中尝试了一个标准方法:
public string ThemePath()
{
string currentPath = Server.MapPath("~");
if (string.IsNullOrEmpty(currentPath))
{
currentPath = "Error!";
}
else
{
currentPath …
Run Code Online (Sandbox Code Playgroud) 我很确定我在这里做错了什么.在过去的两个月里,我们一直在使用MVC和Razor开发一个Web应用程序,我们从未想过使用表单元素.现在已经完成了母版页和子页面的大量工作,这意味着重构我们的大部分代码以便使用表单元素,这将导致页面上的多个表单元素.
除此之外,在Asp.Net中,如果我想访问后面的C#代码中的任何控件,我可以给它一个ID ="SomeID"和一个RUNAT ="SERVER".然后在我的代码后面我可以设置它的值和属性.
当我在Razor中执行此操作时,我们使用以下行:
<input id="hiddenPostBack" runat="server" type="hidden" />
Run Code Online (Sandbox Code Playgroud)
为什么我不能在控制器中访问它?我想检测回发并将值设置为false,如果它是第一次加载页面,如果没有,则将值设置为true.然后基于此,我将在服务器端或客户端读取它并做一些事情.
我真正的问题是,如果我没有表单元素,我如何在服务器端和客户端"做某事".我的印象是,如果我想将值从客户端传递到服务器并返回,最简单的方法是使用隐藏输入.但我只是没有通过MVC3和剃刀来实现这一目标.
在此先感谢您的帮助.
我正在开发一个简单的练习,并想知道是否有一种方法只使用XAML绑定到另一个元素的反面.例如.我在表单上有两个按钮,Start和Stop可能是一个计时器.我不希望两者同时启用.程序启动时,应禁用停止按钮.单击开始按钮时,应禁用它并启用停止按钮.然后反之亦然,直到用户退出.
我知道有更好的控件,我知道在代码中很容易做到.我只是想知道XAML中是否存在某种类似于NOT的运算符:
<Button Content="_Start" Name="btnStart"/>
<Button Content="_Stop" Name="btnStop"
IsEnabled="{Binding ElementName=btnStart,
Path=Not(IsEnabled)}"/>
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
Path != IsEnabled}"/>
Run Code Online (Sandbox Code Playgroud)
甚至是:
Path=IsEnabled.Not()}"/>
Run Code Online (Sandbox Code Playgroud)
我知道我可以直接绑定到开始按钮,但是当一个启用时,另一个启用按钮,同样禁用它时.看看我来自哪里.
我甚至愿意接受某种XAML Validation thehnique,它将首先检查启动按钮的状态并强制停止状态为相反.或任何其他不需要代码隐藏的类似黑客或变通办法.
感谢您的帮助.
编辑:记住关键点是没有代码.如果我必须编写一行代码,我可以使用onclick事件处理程序和一个简单的?:运算符.所以我只想要一些可以在XAML中直接使用的东西.
在去年的大学里,我遇到了一些我发现存储过程非常有趣的东西.主要是减少事务管理,错误处理和安全性的代码重复.但我已经研究过它,无法在任何地方找到它.也许我不知道它叫什么,所以我会解释.
假设我有一个简单的表(忘记它的关系,只是一个表).我至少有5种可能的操作,即CRUD,其中R读取一行的详细信息,或者读取给定条件的行列表.再说一次,让我们不要对复杂的存储过程进行太多详细介绍,让我们假装,对于这个例子,我们只需要执行以下5个操作:
select * from sometable where some condition
,没有复杂),出于本示例的目的,可以使用包含2或3列的简单表,以及执行这些操作时可以使用的最简单的过程.
问题:
我的讲师在与我们谈论交易时,建议我们采取这些简单的程序,并按正常方式将它们分开.但是然后编写一个执行其中每个操作的主程序.这意味着我们有一个主程序,我们传递一个字符让我们说'C'用于创建等等,以及一系列决定运行哪个作业的条件.当然,我们应该将主从需要的细节传递给子proc,这意味着我们需要从用户那里获取它们作为参数.这个主程序已经开始听起来很复杂.
他的推理是,在主程序中进行事务处理,验证,错误处理和安全处理.然后使用所需的参数调用该master过程,该过程执行所有检查,并将参数传递给子过程.以下是一个例子.
简单的表,不要过多担心关系,键,索引,约束,触发器等.
对于以下两段代码,唯一真正相关的位是try ... catch之间的部分.其余的是主人的锅炉板.
以下是创建过程的代码:
ALTER proc [Actions].[AreaCreate]
--External Variables - Input
@AreaName varchar(50), @AreaAvailablity bit, @Description varchar(max),
--External Variables - Output
@NoOfRecords int output
as
--Internal Variables
declare @ErrorMessage varchar(max)
Begin try
insert [Tennis3rdYrMVC].[dbo].Areas
([AreaName], [AreaAvailablity], [Description])
values (@AreaName, @AreaAvailablity, @Description)
--Show # of records affected so you can detect nulls or empty lists
--and handle them as you …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用并且爱上了MVC设计模式.
我唯一的宠儿就是它似乎产生了很多重复的代码.例如.
我有一个标准的MVC应用程序,我的数据库(模型)在一个项目中,与另一个项目中的控制器/视图/视图模型分开,再次与我在另一个项目中的测试方法分开.一切都很好.
模型:现在,我在我的数据库项目中有一堆很好的EF4类,我必须在实际项目中使用ViewModel来访问我的数据.这里没问题.
控制器:但是,我拥有的每个控制器,基本上都是一样的.它从ViewModel获取并设置数据,因此每个控制器的不同之处在于它只获得不同的数据,它们基本上都以完全相同的方式完成相同的工作.(我目前有9个,但这很容易爆炸到超过50个).
例如:
public class Dummy1Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Customers/
public ActionResult Index()
{
if (_entities.table1.Count() == 0) return View();
var pastObj = _entities.table1.First();
return View(new Table1ViewModel()
{
Id = pastObj.Id,
FirstName = pastObj.FirstName,
LastName = pastObj.LastName,
.
.
.
.
});
}
}
public class Dummy2Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Vehicles/ …
Run Code Online (Sandbox Code Playgroud) 上面的链接没有回答这个问题......
我在TFS上遇到了一些问题,其中visual studio在本地机器上构建没有问题,但是当我尝试在服务器上构建时,我遇到了构建错误.错误与此问题无关.
我遇到的问题是,为了修复错误,我必须手动编辑本地计算机上的一些文件,并且由于它们是手动编辑的,因此TFS不会检测到更改,所以它不会让我上传我的更改集服务器可以解决那里的问题.
我的第一个主要问题是:如何强制TFS将所有本地文件复制到服务器.有点像整体的反面:
转到视图/其他Windows /源代码管理资源管理器/右键单击相关项目/高级/获取特定版本/选中"覆盖所有文件..."/按确定.
哪个(可以说,因为它并不总能得到我的经验)从服务器到本地机器获取完整的文件集.
我厌倦了TFS上传部分文件集,然后当本地删除解决方案,然后从服务器重新下载时,我必须从一些备份中提取丢失的文件和引用.如果它是完全上传的,并且在开始时正确上传,那么我可能会遇到这些问题.所以这是我的主要问题.我如何强制TFS上传我的所有文件,无论它们是否已根据它更改.
为了进一步解释我在nuget包管理器中遇到的问题.我禁用了"允许NuGet在构建期间下载丢失的包"选项.所以本地我得到了实际的构建错误.是的,这是正确的,构建错误.像这样...
项目XXX:默认情况下禁用包还原.要同意,请打开Visual Studio选项对话框,单击程序包管理器节点,然后选中"允许NuGet在构建期间下载缺少的程序包".您还可以通过将环境变量"EnableNuGetPackageRestore"设置为"true"来表示同意.
现在迫使我重新启用此选项以消除错误.我很生气,因为这些错误应该作为警告提出,以免妨碍构建.这是非常令人失望的,因此我对NuGet的看法很差.
无论如何足够的咆哮,我重新启用了这个,而不是像我有一个选择.但是这个被禁用的版本进入了服务器.现在我在服务器上收到此错误.我尝试重新启用它并进行检查,但TFS不会让我.(警告......没有待定的更改).当然不是,它只是一个愚蠢的复选框.什么可能改变了.但是现在我在服务器上遇到一个我无法解决的错误,因为NuGet的某个人没有把一些教导用于正确设计他们的警告(而不是通过导致错误来防止构建).
那么,再一次,我如何强制TFS将所有文件(逐字更改或更改)提取到服务器.这样,当我在本地解决问题时,它"应该"也在服务器上修复它.或者至少,当我下次下载它时,我可以确保拥有整个文件集.
抱歉,如果这听起来像我是消极的,但我已经在这5天了,它完全停止了开发,花费了我和公司很多钱.任何帮助将非常感谢.
刚刚大学毕业,我遇到了一些需要减少耦合的代码.但我并不完全理解所有概念,并想要一个简单的例子来帮助我.为了让你开始,我有一个人类,一个字段,名称.我在该类中有一个方法来连接一些文本.
我知道这是一个愚蠢的例子,大多数人都不会考虑在这种简单的情况下减少耦合,但我只想要一个简单的例子来帮助我完全理解代码和概念.
在主窗口后面的代码中,我放了一个文本框和一个按钮.窗口加载时,它显示person x name字段的当前值.单击该按钮时,将调用x.PersonAddText方法.目前,此示例的耦合计算为8.按钮单击事件为3,窗口加载事件为3.
有没有办法,使用这个例子,我们可以将它们降低到低于它们中的一个或两个.
以下是我的所有代码:
我的人员类:
public class Person
{
//Fields
private string name;
//Properties
public string Name
{
get { return name; }
set { name = value; }
}
//Constructors
public Person()
{
name = "joe";
}
//Methods
public string PersonAddText(string text)
{
return name += " - " + text;
}
//Interfaces (or additional code below here please to aid understanding)
}
Run Code Online (Sandbox Code Playgroud)
我的守则背后:
Person x = new Person();
public MainWindow()
{
InitializeComponent();
}
private void …
Run Code Online (Sandbox Code Playgroud) 我在MVC3应用程序上有一个组合框.当选择一个新项目时,它会根据我的要求发回一个帖子.一切都很好.在这个过程中,我弹出一个查询字符串并在页面加载时读取它.页面刷新时,它会读取查询字符串并根据需要设置其他控件.
但是,我需要检测页面何时重新加载,它是由于回发而不是第一次加载页面.这是因为当页面最初加载时,一切都搞砸了,直到有人从组合框中选择了一些内容.
然而,网站的新用户不会知道这一点,只会看到一团糟.
据我所知,MVC3应用程序不像ASP.Net那样具有相同的isPostback,并且由于各种原因我不明白,我知道它在某种程度上不被认为是"可接受的".
但是,我只是想知道是否有100%保证可靠的方法来区分页面首次加载和回发与ASP.Net中的方式相同.如果有这样的方式,它是什么以及如何实现它.
我见过其他帖子这样做:
public bool IsPostBack
{
get
{
return ViewBag.IsPostBack = (Request.HttpMethod == "POST");
}
}
Run Code Online (Sandbox Code Playgroud)
但我读到其他地方,这总是如此.因此,如果这始终是真的,那么在第一次加载时也是如此,因此,我无法可靠地判断它是否是回发.我当然知道这是某种回发.但它不是第一次加载.
任何人都可以帮我解决这个问题.此外,我使用Razor视图引擎而不是标准的aspx视图引擎.
我是C#和SQL的新手.但是在过去的几年里,在大学学习时,一个问题真的开始在我内心燃烧.这里是:
在我看来,有两种非常通用的方法来处理输入验证(即检查所需的字段,以及正确范围内的数据等).
第一种,以及传统方式显示的方式是:开发UI后,以某种方式将其连接到数据库后端.在用户界面上,检查输入是否正确,例如空白文本框,数字范围,或确保选中了收音机或复选框等.
第二种,以及数据库开发中显示的方式是:在字段上设置检查约束,例如不允许空值,唯一值,甚至范围和必填字段.
我的困境是这样的.鉴于在C#这样的现代语言中你可以进行一般的执行处理,并且考虑到大多数数据库(例如SQL Server)在处理有关提交全部或者没有提交的数据更改方面都建立了大联盟容错.像这样的细节,在这个层面上,除了最简单的程序之外,很难编程.
所以我的问题是,为什么不直接在数据库后端的表中构建所有需求.利用前面提到的容错功能,忘记编写if语句以确保输入正确的数据,而只是在未提交数据时使用通用的catch all execption处理程序.
也许这就是它是如何完成的,如果是这样我真的很想知道.如果没有,为什么?我的偏好是尽可能避免编写代码.在更新方面,代码更少,调试更少,问题更少.因此,我倾向于采用让DB后端完成工作的方法.这是一般的正确做法.
我知道一般的执行处理在资源方面被认为是"昂贵的".但是,一旦你通过5或10个if语句来处理不同的字段及其约束,那么只需执行一般的execption处理程序就必须更加高效.整体而言,它似乎更容易理解.(至少我这样做).
感谢您对此的帮助.
我在 C# 中使用 Repository 模式时遇到问题,尤其是当我也尝试实现 Façade 模式时。我的概念如下:
当我第一次启动通用存储库时,我从一个在单个文件中包含所有 CRUD 操作(以及在一个单独的单个文件中的相关接口)开始的存储库。但是由于 SOLID 原则,尤其是 ISP 原则,我决定将所有接口隔离到单独的文件中,并对类进行同样的处理。
因此,例如,不要在一个文件中使用 IGenericRepo 和各种 Create、Read ... 方法,而在另一个文件中使用相应的 GenericRepo。我把它们全部隔离开来,有一个基本的回购来做任何常见的事情。所以我最终得到了一个 ICreateRepo、一个 IReadOneRepo、一个 IReadManyRepo ......等等。
随着时间的推移,我的项目需求不断增长,我发现自己需要多个“读取”操作:
Run Code Online (Sandbox Code Playgroud)public T Read(int id)
Run Code Online (Sandbox Code Playgroud)public T Read(params object[] keyValues)
Run Code Online (Sandbox Code Playgroud)public T Read(Expression<Func<T>,bool>> predicate)
这很好,直到我遇到需要读取多条记录并返回符合条件的所有记录的列表的情况。本质上,读取操作具有与上一个提到的相同的方法签名,不同之处仅在于其返回类型。一个返回单个实体,另一个返回匹配实体的列表。
public IQueryable<T> Read(Expression<Func<T>,bool>> predicate)
Run Code Online (Sandbox Code Playgroud)
虽然分成他们自己的班级,但没有问题。然而,我在我的控制器(我使用 MVC)中发现我有大约 6 或 9 个存储库的长列表,我想将其简化为一个类似于我对单个泛型的存储库列表。所以我转向了 Facade 模式。
现在,当我将读取功能组合在一起时,我会遇到多态行为的问题,因为签名是相同的。
//ReadOne 1
public T Read(int id)
{ }
//ReadOne 2
public T Read(params object[] keyValues) …
Run Code Online (Sandbox Code Playgroud) c# ×9
asp.net-mvc ×6
sql ×2
sql-server ×2
.net ×1
asp.net ×1
c#-4.0 ×1
coupling ×1
data-binding ×1
decoupling ×1
generics ×1
html ×1
mysql ×1
razor ×1
reflection ×1
repository ×1
tfs ×1
viewbag ×1
xaml ×1